UICollectionViewCell의 편집 메뉴 표시

하고 싶은 일



임의의 UICollectionViewCell이 길게 탭되었을 때에 임의의 편집 메뉴를 표시한다.

이런 느낌↓


환경


  • Xcode 7.1
  • iOS 9.1

  • 위 환경 이외에서는 시도하지 않았지만 아마 iOS6.0 이상이라면 작동한다고 생각합니다.

    방법



    UICollectionViewCell의 편집 메뉴를 표시하려면 먼저 다음 세 가지 대리자 메서드를 구현해야 합니다.
  • collectionView:shouldShowMenuForItemAtIndexPath:
  • collectionView:canPerformAction:forItemAtIndexPath:withSender:
  • collectionView:performAction:forItemAtIndexPath:withSender:

  • 게다가 각 메소드내에서 편집 메뉴 표시에 관한 세세한 지정을 실시하는 처리를 기술할 필요가 있습니다.

    순서대로 설명하겠습니다.

    1. collectionView:shouldShowMenuForItemAtIndexPath:



    편집 메뉴를 표시하는 셀을 BOOL 값을 반환하여 지정합니다. 이 메서드에서 NO가 반환된 IndexPath 셀에 대해서는 편집 메뉴가 표시되지 않습니다.
    - (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        if ( indexPath.row < 3 ) {
            return YES;
        }
    
        return NO;
    }
    

    이 경우 처음 3개의 셀(0~2)만 편집 메뉴가 표시됩니다.

    2. collectionView:canPerformAction:forItemAtIndexPath:withSender:



    표시할 편집 메뉴를 BOOL 값을 반환하여 지정합니다. 편집 메뉴의 종류와 셀렉터로서 건네받는 액션 메소드는 다음과 같습니다.


    메뉴
    액션 메소드



    cut:

    복사
    copy:

    붙여넣기
    paste:

    - (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(nonnull SEL)action forItemAtIndexPath:(nonnull NSIndexPath *)indexPath withSender:(nullable id)sender
    {
        if ( [NSStringFromSelector(action) isEqualToString:@"copy:"]
            || [NSStringFromSelector(action) isEqualToString:@"paste:"] ) {
            return YES;
        }
    
        return NO;
    }
    

    이 경우 복사 및 붙여넣기만 편집 메뉴로 표시됩니다.

    3. collectionView:performAction:forItemAtIndexPath:withSender:



    마지막으로 편집 메뉴가 탭될 때의 동작을 설명합니다.
    - (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
    {
        if ( [NSStringFromSelector(action) isEqualToString:@"copy:"] ) {
            // なんかする
        } else if ( [NSStringFromSelector(action) isEqualToString:@"paste:"] ) {
            // なんかする
        }
    }
    

    상기의 코드에서는 하고 있지 않습니다만, 인수로서 (당연합니다만) 셀의 indexPath가 건네지기 때문에, 그것을 바탕으로 무언가 처리를 기술하게 된다고 생각합니다.

    요약



  • collectionView : shouldShowMenuForItemAtIndexPath : 메소드를 구현하고 편집 메뉴를 표시 할 셀을 지정합니다.

  • collectionView : canPerformAction : forItemAtIndexPath : withSender : 메소드에 표시 할 편집 메뉴의 내용 (컷/복사/붙여 넣기 중 하나)을 지정합니다

  • collectionView : performAction : forItemAtIndexPath : withSender : 메소드를 사용하여 편집 메뉴를 탭할 때 처리를 설명합니다

  • 이번에는 기본 UICollectionViewCell을 그대로 사용하고 있습니다만, 자작 Cell 클래스를 사용해도 같은 방법으로 편집 메뉴 표시를 실현할 수 있습니다.

    참고문헌



    이번 기사를 쓰기에 즈음해, Apple의 공식 다큐멘드인 「Collection View Programming Guide for iOS」의 「Showing the Edit Menu for a Cell」의 항목을 참조했습니다.

    좋은 웹페이지 즐겨찾기