Настройте UIMenuController - PullRequest
       11

Настройте UIMenuController

6 голосов
/ 22 октября 2009

Здравствуйте, я хочу создать настраиваемое всплывающее меню, например, вырезать / скопировать / вставить меню в IPhone SDK3.x. Я знаю, что это UIMenuController, но он только обеспечивает стандартное меню вырезать / копировать / мимо. Кто-нибудь знает, как сделать подобное меню. Любой пример и код для справки?

Ответы [ 2 ]

39 голосов
/ 02 ноября 2010

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 голосов
/ 04 мая 2010

Используйте свойство menuItems в UIMenuController.

...