2009-10-22 2 views
6

안녕하세요 아이폰 SDK3.x에서 잘라 내기/복사/붙여 넣기 메뉴와 같은 사용자 정의 버블 메뉴를 만들고 싶습니다. UIMenuController라는 것을 알고 있지만 표준 잘라 내기/복사/과거 메뉴 만 제공합니다. 누구나 이와 비슷한 버블 메뉴를 만드는 방법을 알고 있습니다. 참조 용 예제 및 코드는 무엇입니까?UIMenuController 사용자 정의

답변

-1

UIMenuController의 menuItems 속성을 사용하십시오.

+0

일반적으로 대답은 코드의 의도에 대한 설명이 포함되어 있고 다른 사람을 소개하지 않고 문제를 해결하는 이유가있는 경우에 유용합니다. –

39

1) 공유 UIMenuController에 사용자 정의 메뉴 항목을 추가해야합니다 당신을 첫 번째 응답자 될 뷰의 리스폰 더 체인에 어딘가에 핸들러 메소드를 구현해야

UIMenuItem* miCustom1 = [[[UIMenuItem alloc] initWithTitle: @"Custom 1" action:@selector(onCustom1:)] autorelease]; 
UIMenuItem* miCustom2 = [[[UIMenuItem alloc] initWithTitle: @"Custom 2" action:@selector(onCustom2:)] autorelease]; 
UIMenuController* mc = [UIMenuController sharedMenuController]; 
mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2, nil]; 

2)

: 당신이 메뉴를 표시 할 때 첫 번째 응답자가 될 것 뷰의 응답자 체인 : 당신이 선택적으로 canPerformAction를 구현해야)

- (void) onCustom1: (UIMenuController*) sender 
{ 
} 

- (void) onCustom2: (UIMenuController*) sender 
{ 
} 

3 : 메뉴를 표시

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(onCustom1:)) 
    { 
      return YES; // logic here for context menu show/hide 
    } 

    if (action == @selector(onCustom2:)) 
    { 
      return NO; // logic here for context menu show/hide 
    } 

    if (action == @selector(copy:)) 
    { 
      // turn off copy: if you like: 
     return NO; 
    } 

    return [super canPerformAction: action withSender: sender]; 
} 

4) 메뉴를 표시하려는보기가 아직 메뉴 표시를 지원하지 않는 경우 (예 : UIWebView는 사용자가 길게 탭할 때 메뉴를 표시하지만 UILabel에는 메뉴 표시에 대한 지원 기능이 내장되어 있지 않음), 메뉴를 직접 제시해야합니다. 이것은 종종 다음 콜백에서 메뉴를 보여주는 뷰에 UILongPressGestureRecognizer를 부착하여 수행됩니다

UILongPressGestureRecognizer* gr = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector(onShowMenu:) ] autorelease]; 
    [_myview addGestureRecognizer: gr]; 



- (void) onShowMenu: (UIGestureRecognizer*) sender 
{ 
    [sender.view becomeFirstResponder]; 

    UIMenuController* mc = [UIMenuController sharedMenuController]; 

    CGRect bounds = sender.view.bounds; 

    [mc setTargetRect: sender.view.frame inView: sender.view.superview]; 
    [mc setMenuVisible: YES animated: YES]; 
} 

주를 표시하는 메뉴에 대한 firstResponder을 주장하는 관점이 있어야한다.

5) 메뉴를 표시하는보기가 canBecomeFirstResponder로 YES/TRUE를 반환하는지 확인하십시오. 예를 들어 UILabel을 첫 번째 응답자로 만들려고하면 NO를 반환하므로 서브 클래스를 만들어야합니다.

6) 그게 전부입니다. 액션 콜백이 호출 될 때 FirstResponder를 다시 사기를 원할 수도 있습니다.하지만 이렇게하려면 firstResponder를 검색하는 로직을 구현해야합니다.

+0

canPerformAction의 보낸 사람이 메뉴가 나타나는 위치의 개체를 나타내지 않습니다. (내 경우 textview) - 왜 어떤 생각? – amok

+0

글쎄, 잘 했어! – gigahari

+0

'- [FirstViewController handleGesture ::] : 웹 페이지에서 포커스가있는 요소에 대해 인스턴스 0x1e865800'에 보낸 인식 할 수없는 선택자. 이 문제를 해결하는 방법? 페이지 안의 아무 요소도 텍스트 입력에 집중하지 않으면이 방법이 실제로 작동합니다. – Dmitry

관련 문제