为了账号安全,请及时绑定邮箱和手机立即绑定

在UITextView中设置行高

在UITextView中设置行高

呼唤远方 2019-12-13 09:03:59
我已经很确定不能使用任何公共API来完成此操作,但是我仍然想问:有什么办法可以改变UITextView中的行高吗?足以静态地完成它,而无需在运行时进行更改。问题是默认的行高太小。文本看起来极度压缩,并且是尝试编写较长文本时的噩梦。谢谢,马克斯编辑:我知道有UIWebView而且很好,可以做样式等。但是它是不可编辑的。我需要具有可接受的行高的可编辑文本组件。Omni Frameworks提供的功能也无济于事,因为它太慢且感觉不正确...
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

在iOS 7之后,styleString方法不再起作用。


有两种新的选择。


首先是TextKit;强大的新版式引擎。要更改行距,请设置UITextView的布局管理器的委托:


textView.layoutManager.delegate = self; // you'll need to declare you implement the NSLayoutManagerDelegate protocol

然后重写此委托方法:


- (CGFloat)layoutManager:(NSLayoutManager *)layoutManager lineSpacingAfterGlyphAtIndex:(NSUInteger)glyphIndex withProposedLineFragmentRect:(CGRect)rect

{

    return 20; // For really wide spacing; pick your own value

}

其次,iOS 7现在支持NSParagraphStyle的lineSpacing。这样可以提供更多控制,例如第一行缩进和边界矩形的计算。所以或者...


NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];

paragraphStyle.headIndent = 15; // <--- indention if you need it

paragraphStyle.firstLineHeadIndent = 15;


paragraphStyle.lineSpacing = 7; // <--- magic line spacing here!


NSDictionary *attrsDictionary =

@{ NSParagraphStyleAttributeName: paragraphStyle }; // <-- there are many more attrs, e.g NSFontAttributeName


self.textView.attributedText = [[NSAttributedString alloc] initWithString:@"Hello World over many lines!" attributes:attrsDictionary];

FWIW,在iOS7下也没有使用旧的contentInset方法来沿UITextView的左边缘对齐文本。相反,要删除边距:


textView.textContainer.lineFragmentPadding = 0;


查看完整回答
反对 回复 2019-12-13
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

仅当您在UITextView上定义了定义styleString的类别时,才可以使用styleString的UITextView子类重写,否则会出现编译错误。例如,在您的UITextView子类中:


#import "SomeDangTextView.h"


@interface UITextView ()


- (id)styleString;


@end


@implementation SomeDangTextView


- (id)styleString {

    return [[super styleString] stringByAppendingString:@"; line-height: 1.5em"];

}


@end


查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 1252 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信