Xcode 6 - 另一个自动布局视图中的自动布局视图

Posted

技术标签:

【中文标题】Xcode 6 - 另一个自动布局视图中的自动布局视图【英文标题】:Xcode6 - Autolayout view in an other autolayout view 【发布时间】:2014-09-17 13:42:37 【问题描述】:

即使使用 ios8,xCode 5 上也不存在此问题。

绿色方块必须在红色方块中,因为 greenView 是红色视图的子视图。但是用 xCode6 构建 greenView 的位置与其父级无关

- (void)viewDidLoad 
[super viewDidLoad];


/**** 1 - REDVIEW, THE CONTAINER *****/

UIView *redView = [UIView new];
redView.backgroundColor = [UIColor redColor];
redView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:redView];

UIView *spaceView = [UIView new];
spaceView.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:spaceView];


NSDictionary *views = @@"spaceView" : spaceView,
                        @"redView": redView;

[self.view addConstraints:[NSLayoutConstraint
                            constraintsWithVisualFormat:@"H:|[spaceView]|"
                            options: 0
                            metrics:0
                            views:views]];

[self.view addConstraints:[NSLayoutConstraint
                            constraintsWithVisualFormat:@"V:|[spaceView][redView]|"
                            options: NSLayoutFormatAlignAllRight | NSLayoutFormatAlignAllLeft
                            metrics:0
                            views:views]];


//CENTER VERTICALY
NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:redView
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:spaceView
                                  attribute:NSLayoutAttributeHeight
                                  multiplier:1
                                  constant:0];
[self.view addConstraint:constraint];


/**** 1 - GREENBUTTON, IN THE CONTAINER *****/

UIButton *greenButton = [[UIButton alloc] init];
greenButton.backgroundColor = [UIColor greenColor];
greenButton.translatesAutoresizingMaskIntoConstraints = NO;
[greenButton addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];
[redView addSubview:greenButton];

views = @@"button" : greenButton;

[redView addConstraints:[NSLayoutConstraint
                                constraintsWithVisualFormat:@"H:|[button(35)]|"
                                options: 0
                                metrics:0
                                views:views]];




问题出在哪里? (您可以复制并粘贴这些行来尝试)

【问题讨论】:

【参考方案1】:

定义的约束是相对于其父视图定位greenButton。问题在于缺少垂直位置约束。另请注意,您使用的视觉语法导致约束冲突:

0 距离领先 0 距离尾随(我删除了这个以使其工作) 宽度为 35 宽度的超级视图!= 35;

如果您对 greenButton 使用以下约束,它将被放置在其父级的左上角。

[redView addConstraints:[NSLayoutConstraint
                             constraintsWithVisualFormat:@"H:|[button(35)]"
                             options: 0
                             metrics:0
                             views:views]];

[redView addConstraints:[NSLayoutConstraint
                             constraintsWithVisualFormat:@"V:|[button(35)]"
                             options:0
                             metrics:0
                             views:views]];

【讨论】:

以上是关于Xcode 6 - 另一个自动布局视图中的自动布局视图的主要内容,如果未能解决你的问题,请参考以下文章

为啥表格视图单元格中的自动布局会导致表格的内容大小被错误地更改?

Xcode 6 自动布局灵活宽度

Xcode 6 不遵守自动布局约束

Xcode 6自动布局按钮相互重叠

自动布局 Xcode 6

Xcode 6.3 故事板自动布局约束