我想按照 snapchat 的方式缩放 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;
}
问题是结果是一大行文本,我希望它分布在多行上。如何做到这一点?如何分隔给定宽度的线条?
最佳答案
如果您想要多行,则不应使用 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。
关于ios - UILabel 文本多行给定文本宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31344787/