iOS 自定义UITabBar
2016-05-19 10:38
525 查看
推荐一篇非常好的集成各种UITabBar的三方库 《点击这里直取demo》
另外一篇根据runtime定制了一款可以出轨的UITarBar 《Runtime实战之定制TabBarItem大小》
点击view的触发机制《iOS事件分发机制(一) hit-Testing》
摘自:
UIView中提供两个方法用来确定hit-testing View,如下所示
当一个View收到hitTest消息时,会调用自己的pointInside:withEvent:方法,如果pointInside返回YES,则表明触摸事件发生在我自己内部,则会遍历自己的所有Subview去寻找最小单位(没有任何子view)的UIView,如果当前View.userInteractionEnabled = NO,enabled=NO(UIControl),或者alpha<=0.01, hidden等情况的时候,hitTest就不会调用自己的pointInside了,直接返回nil,然后系统就回去遍历兄弟节点。简而言之,可以写成这样
另外一篇根据runtime定制了一款可以出轨的UITarBar 《Runtime实战之定制TabBarItem大小》
点击view的触发机制《iOS事件分发机制(一) hit-Testing》
摘自:
UIView中提供两个方法用来确定hit-testing View,如下所示
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; // default returns YES if point is in bounds
当一个View收到hitTest消息时,会调用自己的pointInside:withEvent:方法,如果pointInside返回YES,则表明触摸事件发生在我自己内部,则会遍历自己的所有Subview去寻找最小单位(没有任何子view)的UIView,如果当前View.userInteractionEnabled = NO,enabled=NO(UIControl),或者alpha<=0.01, hidden等情况的时候,hitTest就不会调用自己的pointInside了,直接返回nil,然后系统就回去遍历兄弟节点。简而言之,可以写成这样
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (self.alpha <= 0.01 || !self.userInteractionEnabled || self.hidden) { return nil; } BOOL inside = [self pointInside:point withEvent:event]; UIView *hitView = nil; if (inside) { NSEnumerator *enumerator = [self.subviews reverseObjectEnumerator]; for (UIView *subview in enumerator) { hitView = [subview hitTest:point withEvent:event]; if (hitView) { break; } } if (!hitView) { hitView = self; } return hitView; } else { return nil; } }
相关文章推荐
- Android as Bluetooth Low Energy Peripheral (GATT server).
- 优先队列priority_queue的使用方法
- UI基础 获取当前屏幕显示的viewcontroller
- Apue:daemon
- LigerUI 快速开发UI框架
- 解决淘宝sui插件后退bug
- Leetcode 347. Top K Frequent Elements
- GoAhead2.5源代码分析之3-用户管理实例(umui.c)
- UILabel 图文混排的简单实现
- Android基础之UI更新的四种方式
- LeetCode:Top K Frequent Elements
- Android视图重绘,使用invalidate还是requestLayout
- codeforces_667C. Reberland Linguistics(dp+set)
- Maven项目报"Dynamic Web Module 3.0 requires Java 1.6 or newer."异常的处理办法
- StringBuilder的实现与技巧
- BluetoothAdapter.LeScanCallback
- NanUI for Winform发布,让Winform界面设计拥有无限可能
- StringBuffer 与StringBuilder 区别
- UE4:本地化弹出框
- PropertyValuesHolder实现机制