如何让UIMenuController工作的自定义视图? [英] How to get UIMenuController work for a custom view?
问题描述
我想让以下代码工作:
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屋!