gpt4 book ai didi

ios - 自动布局问题 : iOS 7 vs iOS8

转载 作者:可可西里 更新时间:2023-11-01 05:53:16 25 4
gpt4 key购买 nike

我正在尝试创建一个像这样工作的可折叠工具栏(在 iOS 7 中运行——用于可视化目的的丑陋颜色等):

Toolbar behavior in iOS 7

但是,当我在 iOS 8 中运行代码时,会发生以下情况: enter image description here我已经建立了一个基于以下内容的约束系统: collapsible toolbar diagram

居中 View (未显示)将工具栏保持在屏幕中间。sizing view 被调整以折叠工具栏。 sizing view 锚定在 centering view 的右侧(通过 trailing 约束)。container view 包含工具栏的实际内容。它锚定在 sizing view 的右侧(也通过 trailing 约束)。容器 View 中包含各种内容 View 。他们没有约束。系统应用的默认约束应该是 width、height、top、left,以确保它们在 container view 中保持相对位置。

工具栏的收起是这样实现的:

- (IBAction)showLess:(id)sender {
self.widthConstraint.constant = 50; // adjust this number for collapse / expand
[UIView animateWithDuration:0.3 animations:^{
[self.centeringView layoutIfNeeded]; // trigger animation
}];
}

调整sizing view的宽度。

问题:iOS 8 的行为好像我已经离开锚定了内容 View ,但事实并非如此。

我衷心感谢:

  • 解释为什么 iOS 8 会对给定的(相当简单的)约束有如此截然不同的解释。
  • 关于如何在 iOS 8 中获得预期行为的指示

Source code可用here (适用于 iOS 8 的更新版本)。

更新:这个问题已通过 Stack-overflow 的回答得到解决。基本上,正确答案是 this , 但它在 this answer 中得到了很好的总结.iOS7 和 iOS8 之间的区别不在于解释约束的方式,而在于更新命令通过 View 层次结构向下传递的方式。当我首先在 iOS 7 中实现该行为时,我注意到只有在 sizing view 的父 View 上调用 layoutIfNeeded(即在 居中 View )。在 iOS 7 中,这显然会自动向下渗透到 View 层次结构中。在 iOS 8 中,情况并非如此。您必须使用 setNeedsLayout 手动使约束已更改的 View 无效,然后使用 layoutIfNeeded 更新布局。我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
self.widthConstraint.constant = 50;
[self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
[UIView animateWithDuration:0.3 animations:^{
[self.sizingView layoutIfNeeded]; // trigger animation
}];
}

我希望这可以帮助其他同样陷入此向前兼容性问题的人。

最佳答案

问题已通过 Stack-overflow 的回答得到解决。基本上,正确答案是 this , 但它在 this answer 中得到了很好的总结. iOS7 和 iOS8 之间的区别不在于解释约束的方式,而在于更新命令通过 View 层次结构向下传递的方式。当我首先在 iOS 7 中实现该行为时,我注意到只有在 sizing view 的父 View 上调用 layoutIfNeeded(即在 居中 View )。在 iOS 7 中,这显然会自动向下渗透到 View 层次结构中。在 iOS 8 中,情况不是:您必须使用 setNeedsLayout 手动使约束已更改的 View 无效,然后使用 layoutIfNeeded 。我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
self.widthConstraint.constant = 50;
[self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
[UIView animateWithDuration:0.3 animations:^{
[self.sizingView layoutIfNeeded]; // trigger animation
}];
}

我已经更新了问题以包含答案,但为了回应@unmircea,我也发布了一个单独的答案。

关于ios - 自动布局问题 : iOS 7 vs iOS8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26770852/

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