如何通过仅改变高度而不是宽度来改变UFabel的大小?

Ano*_*ite 35 objective-c uilabel xcode4.5

[self.Review sizeToFit];
Run Code Online (Sandbox Code Playgroud)

sizeToFit之前的结果:

NSStringFromCGRect(self.Review.frame): {{90, 20}, {198, 63}}
Run Code Online (Sandbox Code Playgroud)

sizeToFit后的结果:

NSStringFromCGRect(self.Review.frame): {{90, 20}, {181, 45}}
Run Code Online (Sandbox Code Playgroud)

我希望宽度保持不变.我只是想改变身高.自动掩码是

(lldb) po self.Review
(UILabel *) $1 = 0x08bb0fe0 <UILabel: 0x8bb0fe0; frame = (90 20; 181 45); text = 'I'm at Mal Taman Anggrek ...'; clipsToBounds = YES; opaque = NO; autoresize = LM+RM+H; userInteractionEnabled = NO; layer = <CALayer: 0x8bb68b0>>
Run Code Online (Sandbox Code Playgroud)

我知道有一种方法可以这样做: 如何调整和使UILabel的宽度适合文本大小?

答案要么很奇怪(我们需要重新补给字体信息).或者不清楚.

您还需要定义最大宽度,并告诉程序如果sizeToFit为您提供的宽度大于该最大值,该如何操作.

我将使用奇怪的使用解决方案sizeWithFont.这很奇怪,因为UILabel已经知道标签中的字体了.

实际上sizeToFit究竟是如何表现的呢?它如何决定我们是否需要更薄或更高的UILabel?

Mun*_*ndi 41

这就是它的完成方式.因为标签已经包含了字体信息,所以在这种方法中包含它是微不足道的.

CGSize size = [label.text sizeWithFont:label.font
                     constrainedToSize:CGSizeMake(maxWidth, MAXFLOAT)
                         lineBreakMode:UILineBreakModeWordWrap]; 
CGRect labelFrame = label.frame;
labelFrame.size.height = size.height;
label.frame = labelFrame;
Run Code Online (Sandbox Code Playgroud)

使用更新的Swift版本boundingRectWithSize:

let maxHeight = CGFloat.infinity
let rect = label.attributedText?.boundingRectWithSize(CGSizeMake(maxWidth, maxHeight), 
       options: .UsesLineFragmentOrigin, context: nil)
var frame = label.frame
frame.size.height = rect.size.height
label.frame = frame
Run Code Online (Sandbox Code Playgroud)


vad*_*nov 40

您可以使用sizeThatFits获得相同的结果.

CGSize size = [label sizeThatFits:CGSizeMake(label.frame.size.width, CGFLOAT_MAX)];
CGRect frame = label.frame;
frame.size.height = size.height;
label.frame = frame;
Run Code Online (Sandbox Code Playgroud)

或者,使用sizeToFit.

CGRect frame = label.frame;
[label sizeToFit];
frame.size.height = label.frame.size.height;
label.frame = frame;
Run Code Online (Sandbox Code Playgroud)


chr*_*ith 17

sizeToFit效果很好.唯一的问题是它基于控件的当前大小.

例如,如果要使用标签回收表格视图单元格,则标签在前一个单元格中的宽度可能会减小,因此,对sizeToFit的调用可能看起来不可靠.

只需在发送sizeToFit消息之前重置控件的原始宽度.

  • 这是无价的信息,受到赞赏 (3认同)

ndd*_*ong 5

Swift 3 对这个问题的简单扩展。

extension UILabel {
    func sizeToFitHeight() {
        let size: CGSize = self.sizeThatFits(CGSize.init(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude))
        var frame:CGRect = self.frame
        frame.size.height = size.height
        self.frame = frame
    }
}
Run Code Online (Sandbox Code Playgroud)