原本使用的UITextView做文本編輯器.可以插入圖片!
但是
插入多張圖片以后.非澄镆兀卡頓.項目又急著上線.所以就想著寫好的代碼能否直接替換控件.YYTextView非常給力,可以完美替換.但是替換過程中有幾處需要注意的:
1.使用UIImage樣式插入到富文本還是比較卡頓.嘗試使用插入UIImageView以后就可以了
2.對文本限制.UITextView使用的UITextPosition獲取當(dāng)前高亮狀態(tài)文本.如果為nil說明沒有高亮文本.但是YYTextPosition就稍稍有點延遲.所以需要加一個dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSAttributedString *toBeString = textView.attributedText;
//獲取高亮部分
YYTextRange *selectedRange = [textView valueForKey:@"_markedTextRange"];
SEL selName = NSSelectorFromString(@"positionFromPosition:offset:");
YYTextPosition *position = ((YYTextPosition *(*)(id,SEL,id,int))objc_msgSend)(textView,selName,selectedRange.start,0);
// 沒有高亮選擇的字晶府,則對已輸入的文字進(jìn)行字?jǐn)?shù)統(tǒng)計和限制
if (!position)
{}else{
}
});
3.因為我的編輯器.分為標(biāo)題和內(nèi)容兩個YYTextView.用一個UIScrollerView包了一層.問題就出現(xiàn)了.不想讓其滾動.設(shè)定scrollEnabled屬性為NO以后.依然會有偏移.這不是我想要的.我需要的是兩個YYTextView的偏移值始終為CGPointZero.怎么辦?
原本的思路是根據(jù)文本編輯開始和編輯過程中的通知手動的將兩個YYTextView的偏移值設(shè)為CGPointZero.但是界面總是有所跳動.體驗非常不好
最后查看YYTextView的相關(guān)代碼:看到一個方法就是scrollRectToVisible
并且每次操作YYTextView時都會調(diào)用這個方法.及時的偏移至CGPointZero以后就沒有異常了
4.一個頁面兩個YYTextView.當(dāng)我下面編輯好了以后.再點擊標(biāo)題.此時標(biāo)題是選中的.而內(nèi)容沒有選中.但是內(nèi)容會跳一下.原來YYTextView更新所有的YYTextView的scrollRectToVisible.并且是動畫的.那么.對于我來說.更新過偏移值的那么就需要根據(jù)情況來調(diào)用scrollRectToVisible方法.即當(dāng)前不是第一響應(yīng)的均不走scrollRectToVisible方法即可.方法就是在自己設(shè)定的TextView里面添加一個布爾屬性,YYTextView的事件獲取直接用的是touchBegan:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[[NSNotificationCenter defaultCenter] postNotificationName:ResetIsCurrentSelectWithNo object:nil];
self.fq_isCurrentSelect = YES;
[super touchesBegan:touches withEvent:event];
}
-(void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
{
//如果當(dāng)前選中textView.就直接返回
if (!self.fq_isCurrentSelect) {
return;
}
[super scrollRectToVisible:rect animated:animated];
//因為調(diào)用太頻繁
if (self.scrollVisibleBlock) {
self.scrollVisibleBlock();
}
}
這樣就完美解決了跳動問題