UIView不接收觸摸事件的三種情況:1、不接收用戶交互userInteractionEnabled = NO2、隱藏hidden = YES3、透明alpha = 0.0 ~ 0.014. 如果子視圖的位置超出了父視圖的有效範圍, 那麼子視圖也是無法與用戶交互的, 即使設置了父視圖的 clipsT...
UIView不接收觸摸事件的三種情況:
1、不接收用戶交互 userInteractionEnabled = NO |
2、隱藏 hidden = YES |
3、透明 alpha = 0.0 ~ 0.01 |
4. 如果子視圖的位置超出了父視圖的有效範圍, 那麼子視圖也是無法與用戶交互的, 即使設置了父視圖的 clipsToBounds = NO, 可以看到, 但是也是無法與用戶交互的 提示:UIImageView的userInteractionEnabled預設就是NO,因此UIImageView以及它的子控制項預設是不能接收觸摸事件的 |
1 // 手指按下的時候調用 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; 3 4 // 手指移動的時候調用 5 - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event; 6 7 // 手指抬起的時候調用 8 - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event; 9 10 // 取消(非正常離開屏幕,意外中斷事件) 11 - (void)touchesCancelled:(nullableNSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
1 // 3D Touch相關方法,當前觸摸對象觸摸時力量改變所觸發的事件,返回值是UITouchPropertyie 2 - (void)touchesEstimatedPropertiesUpdated:(NSSet * _Nonnull)touches NS_AVAILABLE_IOS(9_1);
相關代碼:
1 #import “TDView.h" 2 3 @implementation TDView 4 5 // 手指觸摸到這個view的時候調用 6 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 7 8 UITouch *t = touches.anyObject; 9 10 NSLog(@"%ld", t.tapCount); // 點擊這個響應者對象的次數 11 12 NSLog(@"%@", t.window); // 點擊這個響應者對象所在的window 13 NSLog(@"%@", self.window); 14 NSLog(@"%@", [UIApplication sharedApplication].keyWindow); 15 16 NSLog(@"%s", __func__); 17 } 18 19 // 手指在這個view上移動的時候調用 20 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 21 // 獲取觸摸對象 22 UITouch *t = touches.anyObject; 23 24 // 獲取上一個點的位置 25 CGPoint lastP = [t previousLocationInView:self.superview]; 26 NSLog(@"%@----上一個點的位置", NSStringFromCGPoint(lastP)); 27 28 // 獲取當前點的位置 29 CGPoint p = [t locationInView:self.superview]; 30 NSLog(@"%@----當前點的位置", NSStringFromCGPoint(p)); 31 } 32 33 // 手指離開這個view的時候調用 34 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 35 NSLog(@"%s", __func__); 36 } 37 38 // 取消(非正常離開屏幕) 39 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 40 NSLog(@"%s", __func__); 41 } 42 43 @end
補充:關於NSSet和 NSArray
如何訪問 | 如何取值 | 如何遍歷 | 效率 | 應用場景 | |
NSSet 集合 | 無序訪問,不重覆的。 存放到 NSSet 中的內容並不會排序與添加順序也沒有關係 | 取集合裡面任意一個元素 anyObject 通過 anyObject 來訪問單個元素 | for in | 效率高 | (1)比如重用 Cell 的時候, 從緩存池中隨便獲取一個就可以了, 無需按照指定順序來獲取 (2)當需要把數據存放到一個集合中, 然後判斷集合中是否有某個對象的時候 |
NSArray 數組 | 有序訪問,可以有重覆對象。 對象的順序是按照添加的順序來保存的 | 通過下標來訪問 | for forin | 當需要把數據存放到一個集合中, 然後判斷集合中是否有某個對象的時候 |
如有疑問,請發送郵件至 [email protected] 聯繫我。 By:藍田(Loto)