【问题标题】:UILabel with fixed width and flexible height固定宽度和灵活高度的UILabel
【发布时间】:2012-05-26 16:20:14
【问题描述】:

我在详细视图控制器中有一个 UILabel,因此它的内容会根据选定的表格行而变化。我有一个问题,我会根据文本为我的 UILabel 设置一个固定宽度和一个动态高度。我怎样才能做到这一点? (我很抱歉我的错误,但我不是英语)

【问题讨论】:

    标签: iphone objective-c sdk


    【解决方案1】:

    我喜欢继承 UILabel 来为我做这件事。

    AutosizingLabel.h

    #import <UIKit/UIKit.h>
    
    
    @interface AutosizingLabel : UILabel {
        double minHeight;
    }
    
    @property (nonatomic) double minHeight;
    
    - (void)calculateSize;
    
    @end    
    

    AutosizingLabel.m

    #define MIN_HEIGHT 10.0f
    
    #import "AutosizingLabel.h"
    
    @implementation AutosizingLabel
    
    @synthesize minHeight;
    
    - (id)init {
        if ([super init]) {
            self.minHeight = MIN_HEIGHT;
        }
    
        return self;
    }
    
    - (void)calculateSize {
        CGSize constraint = CGSizeMake(self.frame.size.width, 20000.0f);
        CGSize size = [self.text sizeWithFont:self.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];    
    
        [self setLineBreakMode:UILineBreakModeWordWrap];
        [self setAdjustsFontSizeToFitWidth:NO];
        [self setNumberOfLines:0];
        [self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, MAX(size.height, MIN_HEIGHT))];
    
    }
    
    - (void)setText:(NSString *)text {  
        [super setText:text];
    
        [self calculateSize];
    }
    
    - (void)setFont:(UIFont *)font {
        [super setFont:font];
    
        [self calculateSize];
    }
    
    @end
    

    要使用它,请在您的项目中导入/创建 .h 和 .m 文件。然后,如果您在代码中创建 UILabel,它看起来像这样:

    #import "AutosizingLabel.h"
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        AutosizingLabel *label = [[AutosizingLabel alloc] init];
        label.text = @"Some text here";
        [self.view addSubview:label];
    }
    

    如果您使用的是 XIB,您可以选择任何 UILabel 并单击右侧边栏中的 Identity Inspector 将其类设置为 AutosizingLabel。无论哪种情况,设置.text 属性都会自动更新标签的大小。

    【讨论】:

    • 谢谢。然后如何在 Detail View Controller 中使用这个子类来为我的 UILabel 设置动态高度?
    • 从 iOS 7 开始,将 UILineBreakModeWordWrap 更改为 NSLineBreakByWordWrapping。
    • @stas - 没错,但实际上,现在我们有了 NSAttributedString,整个 calc 函数应该被重写以支持它。有时间我会更新的。
    • 是的,@JoshHudnall,就像按下回车时我想到的那样,因为 sizeWithFont:constrainedToSize:lineBreakMode: 也已被弃用。
    【解决方案2】:

    你可以做到..这是代码。

    UILabel *yourlabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y, 100, sizeToFit)];
    yourlabel.numberOfLines = 0;
    

    如有任何疑问,请发表评论。

    【讨论】:

    • 我不能使用 sizeToFit 作为 CGRect 高度的值,Xcode 不允许我这样做。它说这是一个“未声明的标识符”
    • 只需检查此..link 我认为它会解决您的问题。 basheerad.blogspot.com/2011/12/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多