iOS - UITextView實現原理

open class UITextView : UIScrollView, UITextInput, UIContentSizeCategoryAdjusting {}

UITextView繼承于UIScrollView, UITextInput, UIContentSizeCategoryAdjusting,當然UIScrollView繼承于UIView,UIView繼承于UIResponder。

所以我們從UITextView的View hierarchy和Responder chain來分析。

View hierarchy

  1. UITextView
  2. UITextContainerView
  3. 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的。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容