UIMenuController 没有响应第一个选择,只有第二个
Posted
技术标签:
【中文标题】UIMenuController 没有响应第一个选择,只有第二个【英文标题】:UIMenuController not responding to first selection, only second 【发布时间】:2012-03-14 19:07:03 【问题描述】:我有一个带有长按手势识别器的视图:
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDetected:)];
[self addGestureRecognizer:longPress];
[longPress release];
return self;
当检测到长按时,我想在视图上方显示一个 UIMenuViewController,其中包含一个操作,当点击该菜单项时,我想执行一个块:
- (void)longPressDetected:(UILongPressGestureRecognizer *)recognizer
if (recognizer.state == UIGestureRecognizerStateBegan)
[self becomeFirstResponder];
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *actionItem = [[UIMenuItem alloc] initWithTitle:@"Action" action:@selector(someActionSelector)];
[menuController setMenuItems:[NSArray arrayWithObject:actionItem]];
[actionItem release];
[menuController setTargetRect:self.frame inView:self.superview];
[menuController setMenuVisible:YES animated:YES];
- (BOOL)canBecomeFirstResponder
return YES;
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
if (action == @selector(copy:) || action == @selector(cut:) || action == @selector(delete:) ||
action == @selector(paste:) || action == @selector(select:) || action == @selector(selectAll:))
return NO;
else if (action == @selector(someActionSelector))
return YES;
else
return [super canPerformAction:action withSender:sender];
- (void)someActionSelector
if (self.actionBlock)
self.actionBlock();
问题是,这仅在第二次长按和点击组合后才有效。第一次长按视图时,我看到了菜单,但点击菜单什么也没做。第二次再次看到菜单时,我点击它,然后执行该块。
调试器显示someActionSelector
中的断点仅在第二次点击时到达。知道这是为什么吗?
【问题讨论】:
您是否尝试将UIGestureRecognizerStateBegan
更改为UIGestureRecognizerStateRecognized
?
【参考方案1】:
我想通了。监听长按的视图包含在一个视图中,该视图在其框架更改时重新定位一些子视图(通过覆盖setFrame:
,这似乎是个坏主意,但我想不出另一种方法)。因此,当长按发生时,它在侦听视图的父级的父级中触发了layoutSubviews
,它设置了侦听视图的父级的框架,重新定位了侦听视图,这似乎破坏了响应者链或停用菜单。解决方案是在覆盖的setFrame:
内添加一个条件,仅在框架实际发生变化时才触发布局,而长按则不会。我确信有一个更好的方法来监听帧变化,可以完全避免这个问题——请随时在 cmets 中提出建议。
【讨论】:
实际上在我的情况下,框架没有任何变化,仍然没有显示菜单控制器以上是关于UIMenuController 没有响应第一个选择,只有第二个的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIMenuControllerWillShowMenuNotification 隐藏 UIMenuController