如何让UIMenuController为自定义视图工作?

al_*_*lea 19 iphone cocoa-touch iphone-sdk-3.0 uimenucontroller

我正在尝试使用以下代码:

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

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

或者是否有关于此UIPasteboard/UIMenuController主题的示例代码?

kra*_*nyk 49

即使我读完你所有的答案,我也无法使它工作.我正在提供适用于所有人的现成代码.

假设我们有一个名为Controller的控制器类.您只需将以下代码粘贴到此控制器即可使菜单处于其视图中:


- (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;
}
Run Code Online (Sandbox Code Playgroud)

要使菜单工作,必须做的是firstResponder(在我们的例子中我们的控制器 - 见[self becomeFirstResponder]行)必须能够成为第一响应者(覆盖方法canBecomeFirstResponder导致默认实现返回NO)以及因为- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender这应该是返回到可以由执行任何动作firstResponder

  • 您可能希望将该断言更改为使用canBecomeFirstResponder,并将becomeFirstResponder置于断言之外;) (5认同)

小智 7

如果您正在实现自定义视图并且该视图应该是响应者(而不是其他视图,如UITextField),则需要在视图中覆盖canBecomeFirstResponder函数并返回YES:

- (BOOL)canBecomeFirstResponder {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

然后,当您显示菜单时,您应该执行以下操作:

- (void)myMenuFunc {
    if (![self becomeFirstResponder]) {
        NSLog(@"couldn't become first responder");
        return;
    }

    UIMenuController *theMenu = [UIMenuController sharedMenuController];
    CGRect selectionRect = CGRectMake(0, 0, 0, 0);
    [theMenu setTargetRect:selectionRect inView:self];
    [theMenu setMenuVisible:YES animated:YES];
}
Run Code Online (Sandbox Code Playgroud)


Pas*_*cal 7

如果有人仍然有问题:我的菜单曾经工作,有一天奇迹般停止工作.我的应用程序中的其他所有内容仍然可用 现在我已经[window makeKeyAndVisible]application:didFinishLaunchingWithOptions:方法中删除了方法,而其他一切仍然有效,这就打破了UIMenuController!

愚蠢的错误在我身边,很难找到罪魁祸首......


dla*_*lin 0

您不需要将UIMenuController* menuEG 添加到主视图或子视图吗self.view?我认为这就像[self.view addSubView:menu.view];或者我错过了你问题的要点。您可能还想设置菜单视图的框架。