UITextView的坑

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

我用的是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的坑)