【问题标题】:how to show UIMenuController to UIBarButtonItem如何将 UIMenuController 显示到 UIBarButtonItem
【发布时间】:2011-03-23 12:28:30
【问题描述】:

UIMenuController点击后如何在UIBarButtonItem下显示?

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    假设您的 UIBarButtonItem 已连接到:

    -(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;
    

    然后将这些代码粘贴到您的视图控制器中:

    -(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event{
        [self becomeFirstResponder];
    
        /*get the view from the UIBarButtonItem*/
        UIView *buttonView=[[event.allTouches anyObject] view];
        CGRect buttonFrame=[buttonView convertRect:buttonView.frame toView:self.view];
    
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        UIMenuItem *resetMenuItem = [[UIMenuItem alloc] initWithTitle:@"Menu Item" action:@selector(menuItemClicked:)];
    
        NSAssert([self becomeFirstResponder], @"Sorry, UIMenuController will not work with %@ since it cannot become first responder", self);
        [menuController setMenuItems:[NSArray arrayWithObject:resetMenuItem]];
        [menuController setTargetRect:buttonFrame inView:self.view];
        [menuController setMenuVisible:YES animated:YES];
    
        [resetMenuItem release];
    }
    - (void) copy:(id) sender {
        // called when copy clicked in menu
    }
    - (void) menuItemClicked:(id) sender {
        // called when Item clicked in menu
    }
    - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender {
        if (selector == @selector(menuItemClicked:) /*|| selector == @selector(copy:)*/ /*<--enable that if you want the copy item */) {
            return YES;
        }
        return NO;
    }
    - (BOOL) canBecomeFirstResponder {
        return YES;
    }
    

    关键是canBecomeFirstResponder和canPerformAction返回YES。

    Here 是您需要的示例项目。

    这些代码其实来自stackoverflow的其他帖子,我只是把它们组合起来。

    Figure out UIBarButtonItem frame in window?

    How to get UIMenuController work for a custom view?

    【讨论】:

    • 我自己尝试这个时发现菜单的位置有时太靠右了。我可以通过更改以下行来修复它:CGRect buttonFrame=[buttonView convertRect:buttonView.frame toView:self.view];[menuController setTargetRect:buttonFrame inView:self.view]; 到:[menuController setTargetRect:buttonView.frame inView:buttonView.superview]; 给出了更准确的位置。
    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 2012-04-18
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多