第一个,来看下它的行间距
我用的是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 左右两边留相同距离。
这个需求不可能实现这么精准,看图。
做的时候才发现,UITextView不像UILabel那样,他自己附加了一些展示的东西,上下左右预设了间距。所以我调了它的contentInset。
self.textView.contentInset = UIEdgeInsetsMake(10, -4, 0, -100);
变成下面这样,
左间距,上间距有效,貌似右间距没用。原本以为和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,那么计算文本尺寸时将以每个字或字形为单位来计算。