如何让UIMenuController工作的自定义视图? [英] How to get UIMenuController work for a custom view?

查看:111
本文介绍了如何让UIMenuController工作的自定义视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想让以下代码工作:

UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(100, 100, 100, 100) inView: self.view];
[menu setMenuVisible: YES animated: YES];

菜单实例已准备就绪,但未显示 - 宽度始终为零。

The menu instance is ready but it doesn't show - the width is always zero.

或者在 UIPasteboard / UIMenuController 主题上有一些示例代码吗?

Or is there some sample code on this UIPasteboard/UIMenuController topic?

推荐答案

即使我读到你的所有答案,我也无法使它工作。我现在提供的代码将为每个人都工作。

I was not able to get it working even when I read all of your answers. I'm presenting ready code that will work for everyone.

假设我们有一个控制器类Controller。您只需将以下代码粘贴到此控制器即可使菜单在其视图中工作:

Let's say we have a controller class named Controller. You can simply paste the following code to this controller to have the menu working on its view:


- (void)loadView {
    [super loadView];

    UILongPressGestureRecognizer *gr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    [self.view addGestureRecognizer:gr];    
}

- (void) longPress:(UILongPressGestureRecognizer *) gestureRecognizer {
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
        CGPoint location = [gestureRecognizer locationInView:[gestureRecognizer view]];
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        UIMenuItem *resetMenuItem = [[UIMenuItem alloc] initWithTitle:@"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:CGRectMake(location.x, location.y, 0.0f, 0.0f) inView:[gestureRecognizer view]];
        [menuController setMenuVisible:YES animated:YES];
    }
}

- (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:)) {
        return YES;
    }
    return NO;
}

- (BOOL) canBecomeFirstResponder {
    return YES;
}

为了使菜单工作,必须做的是firstResponder在我们的例子中,我们的控制器 - 看到与[self becomeFirstResponder]行必须能够成为第一个响应者(覆盖方法canBecomeFirstResponder导致默认实现返回NO)以及 - (BOOL)canPerformAction:(SEL)选择器withSender:(id)sender ,对于 firstResponder

What has to be done in order for menu to work is that the firstResponder(in our case our controller - see line with [self becomeFirstResponder]) has to be able to become first responder (override method canBecomeFirstResponder cause default implementation returns NO) as well as - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender which should return YES to any action that can be performed by firstResponder

这篇关于如何让UIMenuController工作的自定义视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆