gpt4 book ai didi

objective-c - 使用 NSLayoutConstraints 调整当前 View 的大小

转载 作者:行者123 更新时间:2023-12-03 16:23:25 25 4
gpt4 key购买 nike

我正在尝试使用 NSLayoutConstraint 设置 View 的布局。

我可以在 View 中正确设置内容,但如果约束需要,我还需要能够调整当前 View (我为其设置约束的 View )的大小。换句话说,我想用灵活的窗口设置固定的内容大小,而不是相反。

基本上,我有:

NSDictionary *views = [NSDictionary dictionaryWithObjectsAndKeys:self.v1, @"v1",
self.v2, @"v2",
nil];
// Set horizontal constraints
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v1]-|"
options:0
metrics:nil
views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v2]-|"
options:0
metrics:nil
views:views]];
// Set vertical constraints
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[v1]-[v2]-|"
options:0
metrics:nil
views:views]];
// Initialise height constraint for v1
self.v1Height = [NSLayoutConstraint constraintWithItem:self.v1
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:50];

如果我稍后更改 self.v1Height (通过删除它,重新创建它,然后读取它),我希望 self 的框架扩展(或收缩) )以适应变化的高度。

我不确定它是否相关(因为我对 iOS 比 OS X 更熟悉),但这是 NSPopover 的内容 View 。

我需要添加什么约束才能实现此目的?

最佳答案

有几个问题:

  1. 如果您希望约束定义其包含 View 的大小,则它们不能像现在一样含糊不清。他们必须完全定义他们需要的空间。例如:

    NSDictionary *views = @{@"v1" : self.v1,
    @"v2" : self.v2};

    // Set horizontal constraints

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v1(200)]-|" options:0 metrics:nil views:views]];
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v2(==v1)]-|" options:0 metrics:nil views:views]];

    // Set vertical constraints

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[v1]-[v2(600)]-|" options:0 metrics:nil views:views]];

    // Initialise height constraint for v1

    self.v1Height = [NSLayoutConstraint constraintWithItem:self.v1
    attribute:NSLayoutAttributeHeight
    relatedBy:NSLayoutRelationEqual
    toItem:nil
    attribute:NSLayoutAttributeNotAnAttribute
    multiplier:1
    constant:50];
    [self addConstraint:self.v1Height];

    注意,我设置了 v1 的宽度,将 v2 设置为与 v1 相同的宽度,并且我我还设置了 v2 的高度。再加上您随后创建的 v1Height 约束,现在可以使 View 的布局变得明确。

  2. 完成此操作后,您还需要告诉 View Controller 在应用自动布局时通知弹出窗口 Controller 其内容大小。因此,您的 View Controller 可以实现 viewDidLayoutSubviews:

    - (void)viewDidLayoutSubviews
    {
    [super viewDidLayoutSubviews];

    self.view.frame = CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height);
    self.contentSizeForViewInPopover = self.view.frame.size;
    }

    请注意,frame 的设置非常奇怪,但是如果您不将原点重置为 {0.0, 0.0},您的控件将不会出现在正确的地方。您必须这样做似乎不对,但根据我的经验,您必须这样做。

  3. 与您的问题有些无关,您提到您要“通过删除它,重新创建它,然后读取它”来删除 v1Height 。这是不必要的,也不推荐。 constant 属性是可修改的。作为docs say

    "Unlike the other properties, the constant may be modified after constraint creation. Setting the constant on an existing constraint performs much better than removing the constraint and adding a new one that's just like the old but for having a new constant."

    因此,这意味着您可以执行以下简单操作:

    self.v1Height.constant = newHeight;
    [UIView animateWithDuration:0.5
    animations:^{
    [self layoutIfNeeded];
    }];

关于objective-c - 使用 NSLayoutConstraints 调整当前 View 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17130136/

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