美文网首页iOS开发.
记YYTextView做富文本编辑器的感想

记YYTextView做富文本编辑器的感想

作者: 侭情显現 | 来源:发表于2019-03-29 17:51 被阅读0次
    image.png

    原本使用的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();
        }
    }
    

    这样就完美解决了跳动问题

    相关文章

      网友评论

        本文标题:记YYTextView做富文本编辑器的感想

        本文链接:https://www.haomeiwen.com/subject/wdrrbqtx.html