gpt4 book ai didi

ios - 如何将 UIView 的 3 个 subview 与 NSLayoutConstraint 视觉格式水平对齐

转载 作者:行者123 更新时间:2023-12-01 19:07:21 25 4
gpt4 key购买 nike

我有以下设置:

  • 大小为 (40,40)
  • 的 UIView
  • 此 View 的 3 个 subview ,每个 subview 都有框架 (0,0,40,40)

  • 现在,我希望此设置始终保持以下约束:

    H:|-10-[v1]-10-[v2]-10-[v3]-10-|

    这意味着在 superview 的整个生命周期中需要以下行为:
  • 设置约束后, View 应立即自动布局,如上所示。
  • 由于 superview 本身只有 (40,40),它应该自动调整大小以使布局成为可能。
  • 从那里开始,更改任何 subview 的宽度应该再次布局 View ,以便它们仍然坚持布局格式。

  • 到目前为止,我的方法是这样的:
    - (id)init
    {
    self = [super initWithFrame:CGRectMake(0, 0, 40, 40)];
    if (self) {
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.v1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    self.v2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    self.v3 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];

    [self addSubview:self.v1];
    [self addSubview:self.v2];
    [self addSubview:self.v3];
    NSDictionary *views = @{@"v1" : self.v1, @"v2" : self.v2, @"v3" : self.v3};
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[v1]-10-[v2]-10-[v3]-10-|" options:0 metrics:@{@"10":@10} views:views]];
    [self layoutIfNeeded];
    }
    }

    但我收到了冲突的约束消息:
    (
    "<NSLayoutConstraint:0xed9f040 H:|-(10)-[UIView:0xed9ad30] (Names: '|':MyView:0xed9a040 )>",
    "<NSLayoutConstraint:0xed9f270 H:[UIView:0xed9ad30]-(10)-[UIView:0xed9c370]>",
    "<NSAutoresizingMaskLayoutConstraint:0xeda3770 h=&&& v=-&- UIView:0xed9c370.midX == 0.5*MyView:0xed9a040.width>",
    "<NSAutoresizingMaskLayoutConstraint:0xeda37a0 h=&&& v=-&- UIView:0xed9c370.width == MyView:0xed9a040.width>"
    )

    Will attempt to recover by breaking constraint
    <NSLayoutConstraint:0xed9f270 H:[UIView:0xed9ad30]-(10)-[UIView:0xed9c370]>

    我的猜测是它与无法调整大小的 super View 有关。但我总体上对此有些困惑。有谁知道我做错了什么?

    最佳答案

    您要确保为您设置的以编程方式创建的 View translatesAutoresizingMaskIntoConstraintsNO ,例如:

    self.v1.translatesAutoresizingMaskIntoConstraints = NO;
    self.v2.translatesAutoresizingMaskIntoConstraints = NO;
    self.v3.translatesAutoresizingMaskIntoConstraints = NO;

    如果您希望这三个 subview 彼此具有相同的宽度,间隔 10,您可以使用水平 VFL:
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[v1]-10-[v2(==v1)]-10-[v3(==v1)]-10-|" options:0 metrics:nil views:views]];

    显然,每个 subview 之间的间距为 10 点,父 View 必须宽于 40 点宽。例如,如果父 View 是 100 点宽,一旦您将 subview 之间的 10 个点空间考虑在内(为 subview 本身留出 60 个点的宽度),约束系统将使每个 subview 宽 20 点。

    而且,如果您希望它们的高度为 40 点,则可以定义垂直约束(以及定义您希望它们距其父 View 顶部多远):
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v1(40)]" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v2(40)]" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v3(40)]" options:0 metrics:nil views:views]];

    这将它们定义为与父 View 的偏移为零,但高度为 40 点。

    而且,如果您已经根据约束定义了 View ,则不需要使用 initWithFrame , 而只是使用 init .使用自动布局时,一般不指定 frame对于任何事情,而是让约束决定大小。

    关于ios - 如何将 UIView 的 3 个 subview 与 NSLayoutConstraint 视觉格式水平对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18858966/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com