UITextView的坑

作者: 升级打怪啊怪 | 来源:发表于2016-01-23 23:44 被阅读3328次

    第一个,来看下它的行间距

    我用的是NSAttributeString

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] initWithString:self.textView.text];
    
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    
    paragraphStyle.lineSpacing = 5;
    NSDictionary *attributes = @{
                                 NSFontAttributeName :[UIFont systemFontOfSize:14],
                                 NSParagraphStyleAttributeName:paragraphStyle
                                 };
    [attributedText addAttributes:attributes range:NSMakeRange(0, self.textView.text.length)];
    
    self.textView.attributedText = attributedText;
    

    NSMutableParagraphStyle是一个简单富文本,替换文档的固有属性,可以在一定的字符范围内变化。font、paragraph style、attachment(附件)。

    第二个,滚动到最后一行

    当文字比较多的时候,优先显示最后一行
    采用
    [self.textView scrollRangeToVisible:NSMakeRange(self.textView.text.length, 1)];
    或者:

    CGRect caretRect = [self.textView caretRectForPosition:self.textView.endOfDocument];
    [self.textView scrollRectToVisible:caretRect animated:NO];
    

    感觉这个方法还是不太稳定,但是暂时没有更好的解决方法了。

    第三个,设计说要让UITextView 左右两边留相同距离。

    这个需求不可能实现这么精准,看图。


    Paste_Image.png

    做的时候才发现,UITextView不像UILabel那样,他自己附加了一些展示的东西,上下左右预设了间距。所以我调了它的contentInset。
    self.textView.contentInset = UIEdgeInsetsMake(10, -4, 0, -100);
    变成下面这样,

    Paste_Image.png
    左间距,上间距有效,貌似右间距没用。原本以为和contentSize有关,调了也没用。这一点还不太清楚。
    PS:上间距会根据文字内容多少和UITextView的高度来判断是否取消。所以最好还是设contentInset的时候就把上间距搞掉。

    第四个,类似文字自适应高度

    最终我采用的

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    
    paragraphStyle.lineSpacing = 5;
    NSDictionary *attributes = @{
                                 NSFontAttributeName : Font(14),
                                 NSParagraphStyleAttributeName : paragraphStyle
                                 };
    float stringHeight = [textView.text boundingRectWithSize:CGSizeMake(self.width - 24, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size.height;
    

    这里想提下NSStringDrawingOptions:
    enum { NSStringDrawingTruncatesLastVisibleLine = 1 << 5, NSStringDrawingUsesLineFragmentOrigin = 1 << 0, NSStringDrawingUsesFontLeading = 1 << 1, NSStringDrawingUsesDeviceMetrics = 1 << 3, }; typedef NSInteger NSStringDrawingOptions;
    NSStringDrawingTruncatesLastVisibleLine:如果显示不完全,会截断,最后一行末尾显示...。如果没有指定NSStringDrawingUsesLineFragmentOrigin,这个选项会被忽略
    NSStringDrawingUsesLineFragmentOrigin:绘制文本的时候指定的原点不是baseline origin,而是line fragement origin 。(这里不太清楚。。。)
    NSStringDrawingUsesFontLeading:计算行高使用行间距(字体高+行间距=行高)
    NSStringDrawingUsesDeviceMetrics:计算布局时使用图元文字,而不是印刷字体。

    一般用这两个:
    NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin

    如果为
    NSStringDrawingTruncatesLastVisibleLine或者NSStringDrawingUsesDeviceMetric,那么计算文本尺寸时将以每个字或字形为单位来计算。

    相关文章

      网友评论

        本文标题:UITextView的坑

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