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

Chr*_*zor 5 uilabel ios autolayout ios6

我有一个继承自 的自定义视图类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
Run Code Online (Sandbox Code Playgroud)

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

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

如果我将以下函数放入 中MyCustomView,标签仍然有一行文本:

- (void)layoutSubviews
{
    [super layoutSubviews];
    float width = _myLabel.frame.size.width;
    _myLabel.preferredMaxLayoutWidth = width;
    [super layoutSubviews];
}
Run Code Online (Sandbox Code Playgroud)

如果我将- 函数preferredMaxLayoutWidth内的显式值设置为init,标签将是多行的。

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

提前致谢!

小智 0

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

我在动态标签大小和滚动视图方面遇到了类似的问题,因此我在这里创建了一个原型,可能对您也有用: https: //github.com/briandotnet/AutoLayoutScrollViewExperiment