如何在UITabbar中响应touch * down *事件

时间:2018-02-26 20:21:12

标签: ios uitabbarcontroller uitabbar uitabbaritem

我想在用户触摸选项卡上的 down 时开始为UITabBarItem设置动画。但是,UITabBarDelegate仅提供didSelect方法。在这种情况下检测UIControlEvents.touchDown事件的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您将UITabBar子类化并覆盖hitTest:withEvent:

这是一个子类的示例,该子类在触地时会略微缩小图像,然后在触内时将其还原

@interface TRCTabBar : UITabBar

@end


@implementation TRCTabBar

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if ([view isKindOfClass:UIControl.class]) {
        CGFloat scale = 0.90;
        CGAffineTransform t = CGAffineTransformScale(CGAffineTransformIdentity, scale, scale);
        [UIView animateWithDuration:0.14 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
            view.transform = t;
        } completion:nil];
    }
    return view;
}

// used as a signal to restore the image back to its original state
- (void)setSelectedItem:(UITabBarItem *)selectedItem {
    [super setSelectedItem:selectedItem];
    for (UIView *view in self.subviews) {
        if (!CGAffineTransformIsIdentity(view.transform)) {
            view.transform = CGAffineTransformIdentity;
        }
    }
}

@end

一些注意事项:

  1. 不同于通过hitTest:withEvent:访问的触地事件,内部不触地事件是直接访问的。只需覆盖setSelectedItem:,就有机会在用户抬起手指时执行一些操作。

  2. 无法监视外部触摸(外部)(或其他取消事件)。因此,如果用户轻按,然后向外拖动,然后抬起手指,图像将一直按比例缩小,直到调用下一个setSelectedItem:

  3. 如果使用动画(如我提供的示例代码中的动画),则必须使用UIViewAnimationOptionAllowUserInteraction选项。否则,不会总是调用setSelectedItem:

  4. 您只想从UITabBarButton类中拾取触摸(这是对着陆事件的响应的控件)。用户也可能不小心触摸了UITabBar本身,因此您应该忽略此触摸。 UITabBarButton是一个内部UIKit类,但它是UIControl的子类。使用它可以过滤掉所有其他被忽略的UIView(例如UITabBar本身)。

  5. 很显然,请确保将UITabBar的类(在Interface Builder中或以编程方式)设置为自定义类。