如何响应 UITabbar 中的触摸*向下*事件

How do I respond to a touch *down* event in the UITabbar

我想在用户触摸选项卡上的向下 时开始动画 UITabBarItem。但是,UITabBarDelegate只提供了一个didSelect方法。在此上下文中检测 UIControlEvents.touchDown 事件的最佳方法是什么?

您子class UITabBar 并覆盖hitTest:withEvent:

这是一个子示例class,它在触摸时稍微缩小图像,然后在内部触摸时恢复图像

@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:访问的touch-down事件不同,touch-up-inside事件不是直接访问的;只需覆盖 setSelectedItem: 即可在用户抬起手指时执行某些操作。

  2. 无法监控外部(或任何其他取消事件)。因此,如果用户点击,然后向外拖动,然后抬起手指,图像将保持缩小,直到调用下一个 setSelectedItem:

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

  4. 您只想从 UITabBarButton class(即响应触摸事件的控件)拾取触摸。用户也可能不小心触摸到 UITabBar 本身,您应该忽略这种触摸。 UITabBarButton 是一个内部 UIKit class,但它是 UIControl 的子class。使用它来过滤掉所有其他被忽略的 UIViews(比如 UITabBar 本身)。

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