4

我有一个自定义视图类,它继承自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对于垂直轴和水平轴也有布局多个实例的约束。

要获得多行标签输出,我必须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];
}

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

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

提前致谢!

4

1 回答 1

0

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

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

于 2013-10-07T03:59:13.030 回答