2012-03-14 75 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:內添加一個條件,以便只在框架實際發生更改時觸發佈局,而不是長按。我相信有一個更好的選擇,可以聆聽可以完全避免此問題的幀更改 - 隨時在評論中提出建議。