【问题标题】:Views not expanding to match the constraints given视图未扩展以匹配给定的约束
【发布时间】:2015-08-23 20:43:21
【问题描述】:

我正在学习 UIAutolayout。在这篇文章中,我学习了如何将视图添加到超级视图,然后提供约束。我打算在屏幕上有两个视图,给它们红色和蓝色。由于约束同时影响超级视图和子视图(如格式字符串所示),我已将约束添加到超级视图。(这是错误的???) 我在 viewDidLoad 函数中输入了以下代码。

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


UIView * view1 = [[UIView alloc] init];
[view1 setBackgroundColor:[UIColor redColor] ] ;


UIView *view2 = [[UIView alloc] init];
[view2 setBackgroundColor: [UIColor blueColor]] ;


//Adding the view to the main view.
[self.view addSubview:view1] ;

[self.view addSubview:view2] ;


[view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[view2 setTranslatesAutoresizingMaskIntoConstraints:NO];

//Making the namemap for sending to the function
NSDictionary *nameMap = @{@"view1":view1,@"view2":view2} ;


//Creating the constraint below

NSArray * horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1]-30-|" options:0 metrics:nil views:nameMap] ;

NSArray *view1Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view1]-30-|" options:0 metrics:nil views:nameMap] ;

NSArray *view2Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view2]-30-|" options:0 metrics:nil views:nameMap] ;


//Adding the constraints
[self.view addConstraints:horizontalContraints] ;

[self.view addConstraints:view2Height] ;

[self.view addConstraints:view1Height] ;

问题:我只得到蓝色视图作为屏幕上的输出。我没有得到红色的。我已经在 iPad 和 iPhone 模拟器上测试过,但结果是一样的。没有更多的代码可以给出。我正在使用 Xcode 5 和 iOS 7(嗯,因为我正在学习)。谢谢。

【问题讨论】:

    标签: ios objective-c iphone ipad ios-autolayout


    【解决方案1】:

    问题在于您的“horizo​​ntalContraints”。正如 paresh 所说,您需要指定视图的宽度。

    因此,将“horizo​​ntalContraints”更改为

    NSArray *horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1(==view2)]-30-|" options:0 metrics:nil views:dict];
    

    会给你想要的输出。

    你修改后的整体如下。

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        UIView * view1 = [[UIView alloc] init];
        [view1 setBackgroundColor:[UIColor redColor]];
    
        UIView *view2 = [[UIView alloc] init];
        [view2 setBackgroundColor:[UIColor blueColor]];
    
        [view1 setTranslatesAutoresizingMaskIntoConstraints:NO];
        [view2 setTranslatesAutoresizingMaskIntoConstraints:NO];
    
        //Adding the view to the main view.
        [self.view addSubview:view1];
        [self.view addSubview:view2];
    
        NSDictionary *dict =[[NSDictionary alloc] init];
        dict = @{@"view1":view1, @"view2":view2};
    
        NSArray *horizontalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1(==view2)]-30-|" options:0 metrics:nil views:dict];
    
        NSArray *view1Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view1]-30-|" options:0 metrics:nil views:dict];
    
        NSArray *view2Height = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-30-[view2]-30-|" options:0 metrics:nil views:dict];
    
        [self.view addConstraints:horizontalContraints];
        [self.view addConstraints:view2Height];
        [self.view addConstraints:view1Height];
    }
    

    希望这对您有所帮助。 :)

    【讨论】:

      【解决方案2】:

      编辑:

      我之前的回答假设 view1view2 没有水平约束将它们分开(但事实证明它们就位)。

      这里的实际问题是,当您添加horizontalConstraints 时,这就是您告诉自动布局要做的事情:

      从左边开始留30个空格,加view2,再留60个空格,再加view1,最后从右边距留30个空格。

      但是这里并没有告诉自动布局需要多宽才能保持视图(view1view2)。即使您创建了视图,也没有为它设置任何框架(这意味着没有高度或宽度)。

      现在,当您的视图根据这些约束进行布局时,自动布局只会为您的horizontalConstraints 中的第一个视图提供总可用宽度,在您的情况下为view2(因为没有人告诉自动布局保留任何view1 的宽度,很高兴将其设置为零)。因此,您永远不会看到您的 view1

      您可以采取一些措施来解决它:

      • 为两个视图设置固定宽度
      • 为其中一个视图设置固定宽度,然后通过自动布局将剩余宽度提供给第二个视图。
      • 如果您想保持两个视图的宽度相等,请为它们添加等宽约束。然后自动布局将可用宽度平均分配给view1view2

      原始答案:

      问题其实很简单。您正在向您的self.view 添加两组约束,view1Heightview2Height

      如果你仔细观察它们,这就是你告诉自动布局要做的事情:

      对于视图 1: 从顶部开始在self.view 中留出30 个空格,然后添加view1 并再次留出30 个空格。

      view2 也是如此:从顶部开始在 self.view 中留出 30 个空格,然后添加 view2 并再次留出 30 个空格。

      因此,实际上您将两个视图放置在完全相同的位置。因此,现在只有 z 坐标将确定哪个视图可见。由于您在添加 view1 之后添加了 view2(蓝色),因此它的 view1 重叠。这导致......你猜对了,只是 view2 是可见的。

      【讨论】:

      • 你是对的。但我还为视图添加了水平约束,这将确定视图在水平方向(x 方向)上的位置。我已经要求 view2 左边缘距离容器 30 点,其右边缘距离 view1 60 点,view1 右边缘距离容器右边缘 30 点。然后我将此约束添加到超级视图,即 self.view。这个说法。 NSArray * Horizo​​ntalContraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-30-[view2]-60-[view1]-30-|"选项:0 指标:nil 视图:nameMap] ;
      • 对不起,我没有注意到您添加的水平约束,但我发现了问题。我正在更新我的答案。
      【解决方案3】:

      好吧,就像你正在学习一样难过,所以我给你那个教程:AutoLayout Objective-C

      如果这不能回答您的问题,请随时问我:D

      【讨论】:

      • 感谢您的回答。我已经在使用一本著名的书《大书呆子牧场指南-iOS 编程》。根据这本书我做得对,但仍然没有得到所需的结果。 :(
      猜你喜欢
      • 2023-03-13
      • 2016-11-07
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多