将手势识别器应用于导航栏时遇到问题

时间:2012-06-23 05:38:22

标签: iphone ios uinavigationbar

在我的iPad应用程序中,我在屏幕上有多个视图。

我想要做的是将双击手势识别器应用到导航栏。但是我没有成功,但是当相同的手势识别器应用于该视图时,它可以工作。

以下是我正在使用的代码:

// Create gesture recognizer, notice the selector method
UITapGestureRecognizer *oneFingerTwoTaps = 
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerTwoTaps)] autorelease];

// Set required taps and number of touches
[oneFingerTwoTaps setNumberOfTapsRequired:2];
[oneFingerTwoTaps setNumberOfTouchesRequired:1];

[self.view addGestureRecognizer:oneFingerTwoTaps];

这适用于视图,但完成后:

[self.navigationController.navigationBar addGestureRecognizer:oneFingerTwoTaps]

不起作用。

2 个答案:

答案 0 :(得分:8)

对于其他任何观看此内容的人来说,这是一种更为简单的方法。

[self.navigationController.view addGestureRecognizer:oneFingerTwoTaps];

答案 1 :(得分:4)

为此你需要继承UINavigationBar,覆盖其中的init按钮并在那里添加你的手势识别器。

所以说你创建了一个名为'CustomNavigationBar'的子类 - 在你的m文件中你将有一个这样的init方法:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if ((self = [super initWithCoder:aDecoder])) 
    {
        UISwipeGestureRecognizer *swipeRight;
        swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeRight:)];
        [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
        [swipeRight setNumberOfTouchesRequired:1];
        [swipeRight setEnabled:YES];
        [self addGestureRecognizer:swipeRight];
    }
    return self;
}

然后,您需要在界面构建器中将导航栏的类名设置为子类的名称。

enter image description here

此外,向导航栏添加委托协议以监听手势结束时发送的方法也很方便。例如 - 在上面向右滑动的情况下:

@protocol CustomNavigationbarDelegate <NSObject>
    - (void)customNavBarDidFinishSwipeRight;
@end

然后在m文件中 - 在手势识别方法上(无论你做什么),你可以触发这个委托方法。

希望这有帮助