使用autolayout动态添加子视图时调整superview的大小

时间:2014-12-05 13:42:17

标签: ios interface-builder autolayout

我必须在iPhone屏幕上显示一个带有多个" Switch"控制。并分别使用开启/关闭操作在弹出窗口视图中添加和删除子视图。为了更好地说明情况,见下文

图像。Initial popover

当用户点击按钮时,首先会出现上述弹出视图。 popover必须始终保持在屏幕的中心,并且最初添加接触开关将处于关闭状态。打开时,必须在弹出框中添加以下子视图,同时将弹出窗口保持在屏幕的中心,并根据子视图增加弹出窗口的高度。 Add contact switch "ON"

就像上面的情况一样,popover视图必须再次增加,并在添加两个子视图时添加另外两个子视图"添加邮件"开关将是" ON"。最后看起来像这样,

Final popoverView

那就是它。我在我的应用程序中使用自动布局,这是我困惑的地方。我知道我可以每次删除弹出窗口和一个新的,但这似乎是一种新手选项。那么有没有简单的方法来添加子视图并使用自动布局动态扩展其超级视图?我已经看到UILabel的许多问题并且考虑到它的内在内容大小,但仍无法对这种特殊情况有所了解。任何帮助将不胜感激。快乐的编码。

2 个答案:

答案 0 :(得分:4)

这可以通过简单的布局约束来完成,而不必手动约束容器视图的高度,然后更新该约束的常量。

执行此操作的方法是根据最底部子视图的底部约束容器视图的高度。

conatiner constraints

然后在视图控制器中引用此约束。

constraint reference

现在您可以编写类似下面的视图控制器,它将在容器视图的底部添加一个新的子视图,并自动更新容器视图的高度。

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint;
@property (weak, nonatomic) IBOutlet UIButton *addButton;
@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (nonatomic, weak) UIView *lastView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.lastView = self.addButton;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)addButtonTapped:(id)sender {
    UIView *newView = [[UIView alloc] initWithFrame:CGRectZero];
    newView.translatesAutoresizingMaskIntoConstraints = NO;
    newView.backgroundColor = [UIColor redColor];
    [newView addConstraint:[NSLayoutConstraint constraintWithItem:newView
                                                       attribute:NSLayoutAttributeHeight
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:nil
                                                       attribute:NSLayoutAttributeNotAnAttribute
                                                      multiplier:1.0
                                                         constant:35]];

    [self.containerView addSubview:newView];
    [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[lastView]-(14)-[newView]"
                                                                     options:NSLayoutFormatAlignAllCenterX
                                                                     metrics:nil
                                                                        views:@{@"lastView" : self.lastView, @"newView" : newView}]];
    [self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[newView]-(10)-|"
                                                                     options:NSLayoutFormatAlignmentMask
                                                                     metrics:nil
                                                                        views:@{@"newView":newView}]];

    [self.containerView removeConstraint:self.bottomConstraint];
    self.bottomConstraint = [NSLayoutConstraint constraintWithItem:self.containerView
                                                         attribute:NSLayoutAttributeBottom
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:newView
                                                         attribute:NSLayoutAttributeBottom
                                                        multiplier:1.0
                                                          constant:14];
    [self.containerView addConstraint:self.bottomConstraint];

    self.lastView = newView;
}
@end

将所有这些加在一起,您应该得到以下行为。

enter image description here

答案 1 :(得分:0)

您可以输出视图的高度约束,然后根据元素设置值。