我想在用户触摸选项卡上的 down 时开始为UITabBarItem
设置动画。但是,UITabBarDelegate
仅提供didSelect
方法。在这种情况下检测UIControlEvents.touchDown
事件的最佳方法是什么?
答案 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
一些注意事项:
不同于通过hitTest:withEvent:
访问的触地事件,内部不触地事件是直接访问的。只需覆盖setSelectedItem:
,就有机会在用户抬起手指时执行一些操作。
无法监视外部触摸(外部)(或其他取消事件)。因此,如果用户轻按,然后向外拖动,然后抬起手指,图像将一直按比例缩小,直到调用下一个setSelectedItem:
。
如果使用动画(如我提供的示例代码中的动画),则必须使用UIViewAnimationOptionAllowUserInteraction
选项。否则,不会总是调用setSelectedItem:
。
您只想从UITabBarButton
类中拾取触摸(这是对着陆事件的响应的控件)。用户也可能不小心触摸了UITabBar
本身,因此您应该忽略此触摸。 UITabBarButton
是一个内部UIKit类,但它是UIControl
的子类。使用它可以过滤掉所有其他被忽略的UIView
(例如UITabBar
本身)。
很显然,请确保将UITabBar
的类(在Interface Builder中或以编程方式)设置为自定义类。