preferredMaxLayoutWidth

preferredMaxLayoutWidth

我有一个继承自UIView的自定义视图类。此类具有UILabel作为其子视图。在此自定义视图类的init -function中,我设置了所需的一切,如下所示:

//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 -instance的约束。

要获得多行标签输出,我必须设置preferredMaxLayoutWidth UILabelmyLabel -property。宽度取决于可用的可用空间。在http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html上,我读到我可以先让自动版式计算宽度,然后在设置preferredMaxLayoutWidth -instance的帧(此时内部标签为单行)后将其设置为MyCustomView

如果我将以下函数放入MyCustomView,则标签仍然只有一行文本:
- (void)layoutSubviews
{
    [super layoutSubviews];
    float width = _myLabel.frame.size.width;
    _myLabel.preferredMaxLayoutWidth = width;
    [super layoutSubviews];
}

如果我将preferredMaxLayoutWidth设置为init -function内部的显式值,则标签为多行。

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

提前致谢!

最佳答案

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

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

09-30 00:18