2009-10-22 71 views
6

您好我想在iPhone 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)你需要的地方實現你的處理方法在響應鏈的觀點,這將是第一個響應者,當你顯示菜單:

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

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

3)您可選擇需要實現canPerformAction:在響應鏈的觀點,這將是第一個響應者,當你顯示菜單:

- (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)確保顯示菜單的視圖返回YES/TRUE到canBecomeFirstResponder。例如,如果您嘗試將UILabel作爲第一響應者,它將返回NO,因此您必須將其繼承。

6)就是這樣。當動作回調被調用時,您可能想要resignFirstResponder - 但要做到這一點,您需要實現邏輯來發現firstResponder。

+0

canPerformAction中的發件人不代表菜單出現在/上的對象(在我的情況下是一個文本視圖) - 爲什麼? – amok

+0

很好回答,做得好! – gigahari

+0

' - [FirstViewController handleGesture ::]:無法識別的選擇器發送到實例0x1e865800'在網頁上的焦點元素。如何解決這個問題?當頁面內沒有元素集中輸入文本時,這個方法確實有效。 – Dmitry