UILabel Text Multi Line给定文本宽度

时间:2015-07-10 15:34:45

标签: ios objective-c

我希望精确地扩展UILabel。我有一个文本字段,我插入文本。点击完成后,文本字段会移动并设置标签的文本。我希望在文本大于屏幕宽度时插入多行,并截断标签框以使文本适合。

这是我的代码

if(isCaption){
    //Begin Edit Text
    _textlabel.hidden = NO;
    _textlabel.text = currentText;
    _textFieldOutlet.hidden = YES;
    [_textFieldOutlet setTextAlignment:NSTextAlignmentLeft];
    [_textlabel setTextAlignment:NSTextAlignmentLeft];
    [self.screenShotView bringSubviewToFront:_textlabel];

    _textlabel.frame = CGRectMake(10,
                                  _textlabel.frame.origin.y,
                                  [currentText sizeWithAttributes:@{NSFontAttributeName:[_textlabel font]}].width,
                                  [currentText sizeWithAttributes:@{NSFontAttributeName:[_textlabel font]}].height);


    isEditing = YES;
    isCaption = NO;


}

问题是结果是一个庞大的文本行,我希望它在多行上传播。如何实现这一目标?如何分隔给定宽度的线?

2 个答案:

答案 0 :(得分:2)

如果你想要多行,你不应该用sizeWithAttributes来计算你的宽度:。您应该修复标签的宽度,然后使用boundingRectWithSize:方法计算高度。

您可以按如下方式创建辅助方法:

- (CGSize)suggestedSizeWithFont:(UIFont *)font size:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode forString:(NSString *)text {
      NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
      paragraphStyle.lineBreakMode = lineBreakMode;
      NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font,       NSParagraphStyleAttributeName: paragraphStyle}];
      CGRect bounds = [attributedString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin context:nil];
      return bounds.size;
}

或者您可以创建一个类别并删除那个额外的文本参数。

然后您可以按照以下方式为标签的文本调用方法:

CGSize requiredSize = [self suggestedSizeWithFont:_textLabel.font size:CGSizeMake(self.view.frame.size.width, CGFLOAT_MAX) lineBreakMode:_textLabel.lineBreakMode forString:_textLabel.text];
_textLabel.frame = CGRectMake(0, _textlabel.frame.origin.y, requiredSize.width, requiredSize.height);

您可以将宽度设置为您希望标签适合的宽度。相应地计算高度。但请记住将numberOfLines设置为0.

答案 1 :(得分:0)

尝试插入以下代码行:

_textLabel.numberOfLines = 0;