【问题标题】:Changing NSLayoutContraint constant in viewDidLoad or viewWillAppear don't works在 viewDidLoad 或 viewWillAppear 中更改 NSLayoutContraint 常量不起作用
【发布时间】:2013-06-28 16:56:06
【问题描述】:

我正在尝试做这样的事情:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSLog(@"%@", self.tableViewHeight);
    self.tableViewHeight.constant = 0;
    NSLog(@"%@", self.tableViewHeight);

    [self.tableView setNeedsUpdateConstraints];
    [self.tableView setNeedsLayout];
    [self.view setNeedsUpdateConstraints];
    [self.view setNeedsLayout];
}

但有时这有效,有时无效。我总是在日志中看到正确的消息:

<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00(304@500)] priority:500>
<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00(0@500)] priority:500>

为什么会这样?如何在 UI 可见之前更改 NSLayoutConstraints 属性?

更新:

这段代码工作了 20 次中的 20 次(但我认为现在总是这样):

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    dispatch_async(dispatch_get_main_queue(), ^{
        self.tableViewHeight.constant = 0;
        [self.view setNeedsUpdateConstraints];
    });
}

请告诉我为什么会发生这种情况?

更新 2:

看起来以前的代码仍然无法正常工作,但这是可行的:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.topViewHeight.constant += self.tableViewHeight.constant;
    self.tableViewHeight.constant = 0;
    [self.view setNeedsUpdateConstraints];
}

更新 3:

我永远不会为具有关联视图的多个约束设置相同的优先级(例如 500)...

【问题讨论】:

    标签: ios autolayout viewdidload viewwillappear


    【解决方案1】:

    我注意到您的优先级为 500,这意味着您愿意打破此限制以满足其他限制。我想知道您还有哪些其他限制。如果在 Interface Builder 中执行此操作,它有一种烦人的倾向(至少在 Xcode 4.6.x 中)添加它认为需要的任何约束以消除歧义。您可能想要检查您是否没有其他高度约束或优先的顶部和底部约束。

    归根结底,您设置constant 的技术很好(我想,我发现只使用setNeedsLayout 就足够了),问题可能在于可能存在的其他限制。

    如果您将此约束的优先级更改为 1000,如果您有冲突的约束,您将收到关于它们是什么的错误,这有助于诊断问题。但实际上,您是在告诉自动布局,如果忽略此高度约束以支持其他冲突约束(具有更高或同等优先级),则可以。通过将优先级设置为 1000,您就是说您永远不希望忽略此约束。

    【讨论】:

    • 我已经对齐了垂直 UIView 和 UITableView,两者都具有优先级 500 的高度约束和等于 0 的垂直间距约束。所以我想在应用启动时隐藏我的 UITableView...
    • @k06a 如果您有相同优先级的不兼容约束,但优先级小于 1000,我不相信您可以保证哪个约束会“获胜”。我可以想象各种自动布局的内部实现可能会根据constant 的设置时间改变“赢家”,但我个人不会依赖它。恕我直言,我会让您的约束的优先级确保可预测的模式,而不是依赖于延迟设置约束constant 所享有的特质。它将“面向未来”您的应用程序。
    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多