如何响应 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
一些注意事项:
与通过hitTest:withEvent:
访问的touch-down事件不同,touch-up-inside事件不是直接访问的;只需覆盖 setSelectedItem:
即可在用户抬起手指时执行某些操作。
无法监控外部(或任何其他取消事件)。因此,如果用户点击,然后向外拖动,然后抬起手指,图像将保持缩小,直到调用下一个 setSelectedItem:
。
如果您使用动画(如我提供的示例代码),则必须使用 UIViewAnimationOptionAllowUserInteraction
选项。否则 setSelectedItem:
并不总是被调用。
您只想从 UITabBarButton
class(即响应触摸事件的控件)拾取触摸。用户也可能不小心触摸到 UITabBar
本身,您应该忽略这种触摸。 UITabBarButton
是一个内部 UIKit class,但它是 UIControl
的子class。使用它来过滤掉所有其他被忽略的 UIView
s(比如 UITabBar
本身)。
显然,请确保将 UITabBar
的 class(在 Interface Builder 中或以编程方式)设置为您的自定义 class。
我想在用户触摸选项卡上的向下 时开始动画 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
一些注意事项:
与通过
hitTest:withEvent:
访问的touch-down事件不同,touch-up-inside事件不是直接访问的;只需覆盖setSelectedItem:
即可在用户抬起手指时执行某些操作。无法监控外部(或任何其他取消事件)。因此,如果用户点击,然后向外拖动,然后抬起手指,图像将保持缩小,直到调用下一个
setSelectedItem:
。如果您使用动画(如我提供的示例代码),则必须使用
UIViewAnimationOptionAllowUserInteraction
选项。否则setSelectedItem:
并不总是被调用。您只想从
UITabBarButton
class(即响应触摸事件的控件)拾取触摸。用户也可能不小心触摸到UITabBar
本身,您应该忽略这种触摸。UITabBarButton
是一个内部 UIKit class,但它是UIControl
的子class。使用它来过滤掉所有其他被忽略的UIView
s(比如UITabBar
本身)。显然,请确保将
UITabBar
的 class(在 Interface Builder 中或以编程方式)设置为您的自定义 class。