如何在自动布局环境中基于其子框架更改UILabel框架

时间:2014-05-27 13:23:33

标签: ios objective-c uilabel autolayout addsubview

我正在定制UILabel。我想要做的就是在UILabel内设置自定义视图。我将标签的宽度和高度约束添加到大于100.现在当我将子视图添加到标签时,我想根据其子框架更新标签的框架。我怎样才能做到这一点?

任何帮助都会感激不尽。

2 个答案:

答案 0 :(得分:0)

首先,将宽度和高度约束的优先级降低到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}]];

答案 1 :(得分:0)

我已经实现了另一种方式。因为我正在寻找一种不需要处理约束的方法,它将按照配置的方式运行。为此,我有Derived 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来自center的父UIView。我们无法控制增长的方向。如果这也可以实现那么它将是非常棒的。