【问题标题】:UILabel Text Multi Line given width of textUILabel Text Multi Line 给定的文本宽度
【发布时间】:2015-07-10 15:34:45
【问题描述】:

我想精确地缩放 UILabel 的 snapchat 功能。我有一个文本字段,可以在其中插入文本。当点击完成时,文本字段会消失并设置标签的文本。我想在文本大于屏幕宽度时插入多行并截断标签框架以使文本适合。

这是我的代码

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;


}

问题是结果是一大行文本,我希望它分布在多行上。如何实现?如何分隔给定宽度的线条?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    如果你想要多行,你不应该用 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。

    【讨论】:

      【解决方案2】:

      尝试插入以下代码行:

      _textLabel.numberOfLines = 0;
      

      【讨论】:

      • 查看我的新答案。
      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多