我有UILabel
因为原因我需要转换为UITextView
。当我这样做时,尽管使用相同的(自定义)字体,但文本的位置并不相同。
我发现如果我设置:
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;
这会使文本非常接近,但如果我将UITextView
叠加在UILabel
的顶部,我会看到文本定位与每个新行的距离越来越远。
UILabel
为绿色,UITextView
为黑色。这是使用NSParagraphStyle
将最小和最大行高设置为15。
我已经设置了段落样式和最小/最大行高,但我还没能完全匹配它。我不是打印机,因此我不必理解NSLayoutManager
和NSTextContainer
文档中的所有字体相关术语以及所有这些。
我只需要支持iOS 7及更高版本。
我不会切换到一些疯狂的基于CoreText的自定义小部件或使用一些随机的第三方库。如果必须的话,我已经足够接近了。但似乎应该有一些随机属性的组合来使它们布局相同。
答案 0 :(得分:14)
我找到了at this link行间距的解决方案,并将其应用于您的问题。通过调整lineSpacing
属性,我设法让它非常接近。我测试了HelveticaNeue 13号,并设法让它排成一行,如下面的屏幕截图所示。
textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = -0.38;
NSDictionary *attrsDictionary =
@{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13.0f],
NSParagraphStyleAttributeName: paragraphStyle};
textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:attrsDictionary];
答案 1 :(得分:3)
我已经能够使用等效的可编辑多行UITextView成功“模拟”不可编辑的多行UILabel(在UITableViewCell子类中)以下内容:
_textView = UITextView.new;
_textView.font = _label.font;
_textView.textColor = _label.textColor;
_textView.textAlignment = _label.textAlignment;
_textView.backgroundColor = UIColor.clearColor;
_textView.textContainer.lineFragmentPadding = 0;
_textView.textContainerInset = UIEdgeInsetsZero;
并使其在进行实际编辑时表现良好,请将以下内容添加到UITextViewDelegate:
- (void)textViewDidChange:(UITextView *)textView
{
...
[textView scrollRangeToVisible:NSMakeRange(textView.text.length, 0)];
[textView scrollRectToVisible:[textView caretRectForPosition:textView.endOfDocument] animated:NO];
}