正常情況下來說,UITextView只有在becomeFirstResponder狀態(tài)時(shí)损姜,才會(huì)處于焦點(diǎn)狀態(tài)。這是光標(biāo)才會(huì)出現(xiàn)汰蓉,若是resignFirstResponder后顾孽,則會(huì)收縮鍵盤比规,光標(biāo)消失,那么該如何將在resignFirstResponder沒有鍵盤的狀態(tài)下测秸,還能保持光標(biāo)的存在呢灾常?
首先了解到UITextView有個(gè)自定義輸入視圖
// set while first responder, will not take effect until reloadInputViews is called. @property (nullable, readwrite, strong) UIView *inputView;
inputView可以自定義一個(gè)輸入視圖钞瀑,也就是鍵盤的位置。
因此在正常進(jìn)行輸入時(shí)关串,我們點(diǎn)擊調(diào)用正常的系統(tǒng)鍵盤监徘,當(dāng)需要退出鍵盤吧碾,但同時(shí)要保留焦點(diǎn)時(shí),我們則將自定義鍵盤的inputView置空户敬。
- (void)showKeyBoard:(BOOL)show { [self.textToolsView.content_textview becomeFirstResponder]; if (show) { if (!self.textToolsView.content_textview.inputView) { return; } [self.textToolsView.content_textview resignFirstResponder]; self.textToolsView.content_textview.inputView = nil; } else { if (self.textToolsView.content_textview.inputView) { return; } [self.textToolsView.content_textview resignFirstResponder]; self.textToolsView.content_textview.inputView = [UIView new]; } [self.textToolsView.content_textview becomeFirstResponder]; }
這樣便能達(dá)到我們的效果尿庐,但是也有一個(gè)小小的問題呢堰,就是在鍵盤消失后,雖然光標(biāo)還在皮假,這是點(diǎn)擊TextView是無法調(diào)用起系統(tǒng)鍵盤的,因此需要給UITextView添加監(jiān)聽贺纲!但是UITextView開放的API中褪测,并沒有相關(guān)事件,那么該如何處理呢稠肘?
for (UIGestureRecognizer *gesture in _textToolsView.content_textview.gestureRecognizers) { if ( [NSStringFromClass(gesture.class) isEqualToString:@"UIScrollViewDelayedTouchesBeganGestureRecognizer"]) { gesture.delegate = self; } }
看到以上代碼相信你該明白了萝毛,我們將UITextView的UIScrollViewDelayedTouchesBeganGestureRecognizer點(diǎn)擊手勢代理到本類中,因此便能夠監(jiān)聽到UITextView的點(diǎn)擊事件,并進(jìn)行相關(guān)操作.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ if ([NSStringFromClass(otherGestureRecognizer.class) isEqualToString:@"UIVariableDelayLoupeGesture"]) { return NO; } // [self showKeyBoard:YES]; return YES; }