更新未知大小的多行UILabel的preferredMaxLayoutWidth(自动布局)

时间:2013-08-22 15:42:35

标签: ios ios6 uilabel autolayout

我有一个继承自UIView的自定义视图类。此类的子视图有UILabel。在此自定义视图类的init - 函数中,我设置了所需的所有内容:

//h-file
#import <UIKit/UIKit.h>

@interface MyCustomView : UIView

@property (strong, nonatomic) UILabel *myLabel;

@end

//m-file
@implementation MyCustomView

@synthesize myLabel = _myLabel;

- (id)init
{
    self = [super init];
    if (self) {

        _myLabel = [UILabel new];

        if(_textView){
            _myLabel.highlightedTextColor = [UIColor whiteColor];
            _myLabel.translatesAutoresizingMaskIntoConstraints = NO;
            _myLabel.lineBreakMode = NSLineBreakByWordWrapping;
            _myLabel.numberOfLines = 0;
            _myLabel.backgroundColor = [UIColor clearColor];
            [self addSubview:_myLabel];
        }
    }

    return self;
}

@end

我还设置了一组约束来管理我的自定义视图中的填充 - 此外,还有一些约束来布局多个MyCustomView - 垂直和水平轴的实例。

要获得多行标签输出,我必须设置preferredMaxLayoutWidth UILabel的{​​{1}} - 属性。宽度取决于可用的可用空间。在http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html,我读到,我可以让自动布局首先计算宽度,并在myLabel - 实例的框架之后将其设置为preferredMaxLayoutWidth(此时内部的标签是单行的) 已设置。

如果我将以下功能放入MyCustomView,标签仍然只有一行文字:

MyCustomView

如果我将- (void)layoutSubviews { [super layoutSubviews]; float width = _myLabel.frame.size.width; _myLabel.preferredMaxLayoutWidth = width; [super layoutSubviews]; } 设置为preferredMaxLayoutWidth - 函数内的显式值,则标签是多行的。

有人知道我在这里做错了吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果没有看到您为自定义视图设置的所有约束,以及包含它的超级视图,确定问题非常困难,我建议您从视图开始打印整个视图层次结构的所有视图帧控制器在viewDidLayoutSubviews上的视图,并确定标签及其超视图是否具有正确的框架集。

我遇到类似动态标签大小和滚动视图的问题所以我在这里创建了一个原型,对你也很有用:https://github.com/briandotnet/AutoLayoutScrollViewExperiment