如何使UITextView布局文本与UILabel相同?

时间:2014-06-30 23:34:06

标签: ios objective-c uilabel uitextview

我有UILabel因为原因我需要转换为UITextView。当我这样做时,尽管使用相同的(自定义)字体,但文本的位置并不相同。

我发现如果我设置:

textView.textContainer.lineFragmentPadding = 0;
textView.textContainerInset = UIEdgeInsetsZero;

这会使文本非常接近,但如果我将UITextView叠加在UILabel的顶部,我会看到文本定位与每个新行的距离越来越远。

Screen shot showing text drift.

UILabel为绿色,UITextView为黑色。这是使用NSParagraphStyle将最小和最大行高设置为15。

我已经设置了段落样式和最小/最大行高,但我还没能完全匹配它。我不是打印机,因此我不必理解NSLayoutManagerNSTextContainer文档中的所有字体相关术语以及所有这些。

我只需要支持iOS 7及更高版本。

我不会切换到一些疯狂的基于CoreText的自定义小部件或使用一些随机的第三方库。如果必须的话,我已经足够接近了。但似乎应该有一些随机属性的组合来使它们布局相同。

2 个答案:

答案 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];

Screen Shot

答案 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];
}