2012-03-14 29 views
0

我有一个长按手势识别的视图中它:UIMenuController不响应第一选择,只有第二

- (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中的断点只在第二次敲击时到达。任何想法为什么这是?

+0

您是否尝试将'UIGestureRecognizerStateBegan'更改为'UIGestureRecognizerStateRecognized'? – Costique 2012-03-14 19:12:22

回答

0

我想通了。倾听长按的视图被包含在一个视图中,当它的框架被改变时,它重新定位一些子视图(通过覆盖setFrame:,这似乎是一个坏主意,但我想不出另一种方式)。所以,当长按发生时,它在监听视图的父亲的父亲中触发layoutSubviews,其设置监听视图的父亲的框架,该监听视图的父框架重新定位了侦听视图,该视图似乎中断响应者链或者停用菜单。解决方法是在覆盖的setFrame:内添加一个条件,以便只在框架实际发生更改时触发布局,而不是长按。我相信有一个更好的选择,可以聆听可以完全避免此问题的帧更改 - 随时在评论中提出建议。

相关问题