我正在定制UILabel
。我所要做的就是在UILabel
中设置一个自定义视图。我将标签的宽度和高度约束添加为大于100。当我向标签添加子视图时,我想根据它的子框架更新标签的框架。我怎样才能做到这一点呢?
首先,将width和height约束的优先级降低到800左右。然后,添加约束,使标签至少与其子视图一样高和一样宽:
[self.label addSubview:otherView];
[self.label addConstraints:
[NSLayoutConstraint
constraintsWithVisualFormat:@"|-0-[otherView]->=0-|"
options:0
metrics:nil
views:@{@"otherView" : otherView}]];
[self.label addConstraints:
[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-0-[otherView]->=0-|"
options:0
metrics:nil
views:@{@"otherView" : otherView}]];
我已经用另一种方式实现了。因为我正在寻找一种方式,我不需要处理约束,它会表现得像它被配置。为此,我派生了UILabel并创建了一个自定义标签。然后我实现addSubView
和intrinsicSize
方法如下:
@implement MxCustomLabel
@synthesize dummyView;
- (void) addSubView:(UIView*)view
{
self.dummyView = view;
[self invalidateIntrinsicSize];
dispatch_async(dispatch_get_main_queue(), ^{
[super addSubView:view];
});
}
-(CGSize) intrinsicSize
{
return CGSizeMake(self.dummyView.frame.size.width, self.dummyView.frame.size.height);
}
@end
唯一要注意的是在界面构建器中设置Label的width
和height
约束为greater than or equal
。如果设置为equals
,则该实现将尊重约束并且不会扩大。但是,如果您将高度或宽度设置为greater than or equal
,则此实现将扩展相应约束的大小。
以类似的方式,我们可以从所有来自UIView
的基本组件中设计自定义组件。
虽然,它有限制,它将grow
父UIView从center
。我们无法控制生长的方向。如果这也能实现,那就太棒了。