原本使用的UITextView做文本编辑器.可以插入图片!
但是
插入多张图片以后.非常卡顿.项目又急着上线.所以就想着写好的代码能否直接替换控件.YYTextView非常给力,可以完美替换.但是替换过程中有几处需要注意的:
1.使用UIImage样式插入到富文本还是比较卡顿.尝试使用插入UIImageView以后就可以了
2.对文本限制.UITextView使用的UITextPosition获取当前高亮状态文本.如果为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);
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position)
{}else{
}
});
3.因为我的编辑器.分为标题和内容两个YYTextView.用一个UIScrollerView包了一层.问题就出现了.不想让其滚动.设定scrollEnabled属性为NO以后.依然会有偏移.这不是我想要的.我需要的是两个YYTextView的偏移值始终为CGPointZero.怎么办?
原本的思路是根据文本编辑开始和编辑过程中的通知手动的将两个YYTextView的偏移值设为CGPointZero.但是界面总是有所跳动.体验非常不好
最后查看YYTextView的相关代码:看到一个方法就是scrollRectToVisible
并且每次操作YYTextView时都会调用这个方法.及时的偏移至CGPointZero以后就没有异常了
4.一个页面两个YYTextView.当我下面编辑好了以后.再点击标题.此时标题是选中的.而内容没有选中.但是内容会跳一下.原来YYTextView更新所有的YYTextView的scrollRectToVisible.并且是动画的.那么.对于我来说.更新过偏移值的那么就需要根据情况来调用scrollRectToVisible方法.即当前不是第一响应的均不走scrollRectToVisible方法即可.方法就是在自己设定的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
{
//如果当前选中textView.就直接返回
if (!self.fq_isCurrentSelect) {
return;
}
[super scrollRectToVisible:rect animated:animated];
//因为调用太频繁
if (self.scrollVisibleBlock) {
self.scrollVisibleBlock();
}
}
这样就完美解决了跳动问题
网友评论