【问题标题】:ios make navigation bar clickableios 使导航栏可点击
【发布时间】:2013-08-20 00:08:53
【问题描述】:

只是想让我的 navigationController 的 navigationBar 可以点击。 它适用于

UITapGestureRecognizer* tapRecon = [[UITapGestureRecognizer alloc]
                                    initWithTarget:self action:@selector(toggleMenu)];
tapRecon.delegate = self;
tapRecon.numberOfTapsRequired = 1;
[self.navigationBar addGestureRecognizer:tapRecon];

但是当我有一个后退按钮时,无法点击它(手势可能会接管按钮)。

所以,我尝试了在这里找到的东西:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return (![[[touch view] class] isSubclassOfClass:[UIButton class]]);
}

什么也没有,因为[touch view] 总是 UINavigationBar...

我尝试做的最后一件事是将cancelsTouchesInView 设置为NO。没关系,我们可以点击返回按钮,但是UITapGestureRecognizertoggleMenu动作还是被调用了。

您是否有让后退按钮再次起作用但不同时调用toggleMenu 的想法?

谢谢!

编辑:

Juste 找到了怎么做:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    for (UIView* sub in self.navigationBar.subviews) {
        NSString *cl = NSStringFromClass([sub class]);
        if ([cl isEqualToString:@"UINavigationItemButtonView"]) {
            CGRect bback = sub.frame;
            CGPoint pointInView = [touch locationInView:gestureRecognizer.view];
            return !CGRectContainsPoint(bback, pointInView);
        }
    }
    return YES;
}

【问题讨论】:

  • 后退按钮是 UIBarButtonItem 的一个实例,它不是 UIView 的子类。 Apple 使用一些私有类来显示这些按钮,这应该是您检查触摸视图失败的原因。

标签: ios objective-c navigationbar touches


【解决方案1】:

您可以制作一个围绕导航栏的按钮,并制作另一个按钮用于按下。一定要把它安排在 IB 中导航栏按钮的顶部

【讨论】:

  • 我没有使用 IB。你认为通过创建我自己的按钮,我可以使用 shouldReceiveTouches 来获取它们吗?
【解决方案2】:

这是 Swift 代码的解决方案:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    for view in self.navigationBar.subviews {
        if let button = view as? UIButton {
            if touch.view.isEqual(button) {
                return false
            }
        }
    }
    return true
}

只需将其放入您的代理中,以获取您的UIGestureRecognizer

【讨论】:

  • 不知道为什么我对此投票不赞成。该代码有效,并且没有公认的解决方案(即使提问者在他的问题中发布了一个)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2017-03-28
相关资源
最近更新 更多