open class UITextView : UIScrollView, UITextInput, UIContentSizeCategoryAdjusting {}
UITextView繼承于UIScrollView, UITextInput, UIContentSizeCategoryAdjusting,當然UIScrollView繼承于UIView,UIView繼承于UIResponder。
所以我們從UITextView的View hierarchy和Responder chain來分析。
View hierarchy
- UITextView
- UITextContainerView
- UITextSelectionView(出現光標的時候會有這個View)
Responder
UITextView對UITouch的處理主要是靠如下幾個GestureRecognizer。
<UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x12ed4a540;
state = Possible;
delaysTouchesBegan = YES;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=delayed:,target=<SealFooDemo.SLTextView 0x12f81fa00>)>>
<UIScrollViewPanGestureRecognizer: 0x12ed4aff0;
state = Possible;
delaysTouchesEnded = NO;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=handlePan:, target=<SealFooDemo.SLTextView 0x12f81fa00>)>>
<UITextTapRecognizer: 0x12ed55e70;
state = Possible;
delaysTouchesEnded = NO;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=oneFingerDoubleTap:, target=<UITextInteractionAssistant 0x12ed55800>)>;
numberOfTapsRequired = 2>
<UITapAndAHalfRecognizer: 0x12ed56d40;
state = Possible;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=tapAndAHalf:, target=<UITextInteractionAssistant 0x12ed55800>)>>
<UITextTapRecognizer: 0x12ed588a0;
state = Possible;
delaysTouchesEnded = NO;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=oneFingerTap:, target=<UITextInteractionAssistant 0x12ed55800>)>>
<UIVariableDelayLoupeGesture: 0x12ed58ed0;
state = Possible;
delaysTouchesEnded = NO;
view = <SealFooDemo.SLTextView 0x12f81fa00>;
target= <(action=loupeGesture:, target=<UITextInteractionAssistant 0x12ed55800>)>>
這里的UITextTapRecognizer是UITapGestureRecognizer的子類,但是在UIKit里面卻找不到,還不知道原因。
for gestureRecognizer:UIGestureRecognizer in self.textView.gestureRecognizers! {
print(gestureRecognizer.cancelsTouchesInView)
}
執行上面代碼的結果都是True,因為所有UIGestureRecognizer的cancelsTouchesInView默認都是false,這樣只要是有UIGestureRecognizer的地方,view都是拿不到被識別走的UITouch的。