在自动布局环境下,如何在子框架的基础上改变UILabel框架



我正在定制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并创建了一个自定义标签。然后我实现addSubViewintrinsicSize方法如下:

@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的widthheight约束为greater than or equal。如果设置为equals,则该实现将尊重约束并且不会扩大。但是,如果您将高度或宽度设置为greater than or equal,则此实现将扩展相应约束的大小。

以类似的方式,我们可以从所有来自UIView的基本组件中设计自定义组件。

虽然,它有限制,它将grow父UIView从center。我们无法控制生长的方向。如果这也能实现,那就太棒了。

最新更新