当前位置: 首页 > 知识库问答 >
问题:

在iOS 10中处理自动布局约束动画差异?

子车凌龙
2023-03-14

我注意到在iOS10 Beta 5(即将尝试Beta 6)中,AutoLayout约束动画的行为有点不同。

例如,此方法的工作原理与以前的iOS版本不同:

[view addConstraints:@[constraints...]];

[view setNeedsUpdateConstraints];
[view layoutIfNeeded];

[UIView animateWithDuration:...
{
    /* adjust constraint here... */
    [view layoutIfNeeded]; // Only the adjusted constraints since previous layoutIfNeeded() call should animate change with duration.

} completion:{ ... }];

。。。在我的测试中,最初用添加约束(addConstraints)添加的约束也将在iOS 10中用UIView(UIView)来设置动画(animateWithDuration)(block)。。。到目前为止,这导致了一些古怪/不受欢迎的行为。

例如,在阵列中设置左/右约束(但在块中设置垂直约束)会使整个视图以对角线方式在屏幕上设置动画。。。这是完全错误的。

有人知道如何正确地为iOS9(及以下)和10做这件事吗?

共有3个答案

冯宏放
2023-03-14

我做了一个小测试,改变了红色小视图的H和V:

self.red_POS_H = NSLayoutConstraint.constraints(withVisualFormat: "H:|-90-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary)


self.red_POS_V = NSLayoutConstraint.constraints(withVisualFormat: "V:|-30-[redView]", options: defaultOptions, metrics: nil, views: viewsDictionary)

self.view.addConstraints(self.red_POS_V!)
self.view.addConstraints(self.red_POS_H!)

并将其设置为动画:

        // we hope is only one:
        let currV = self.red_POS_V![0]
        let currH = self.red_POS_H![0]


        UIView.animate(withDuration: 3) { 
            // Make all constraint changes here

            currV.constant = 100
            currH.constant = 300

            self.view.layoutIfNeeded() // Forces the layout of the subtree animation block and then captures all of the frame changes
        }

红色视图移动正确,如果在动画中注释掉一行,则它在水平或垂直方向上都有效。

如果您需要,可以提供小项目。

曾鸿振
2023-03-14

在以下方法中:

[super viewDidLoad];

写这行:

 [self.view layoutIfNeeded];
广宏远
2023-03-14

尝试在视图的superview上调用layoutIfNeeded,而不是视图本身。

--

我有一个类似的问题,我的观点应该从顶部0高度动画,向下到

将Xcode 8与iOS10一起使用,动画行为大不相同。视图不是从顶部向下动画,而是向上动画

我通过在视图本身调用layoutIfNeed而不是在视图的超级视图上调用它来修复此问题。不知何故,行为被恢复了。

希望有帮助!

根据文档,“layoutIfNeeded”(需要的布局)列出子视图(但不考虑当前视图本身)。因此,为了更新当前视图布局,需要从超级视图调用layoutIfNeeded。

 类似资料:
  • 我在学习教程中的动画自动布局 http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was 一切都很顺利。 当我尝试在我的应用程序中使用这个概念,尝试从下到上设置设置屏幕(UIView)的动画时,当设置屏幕只是一个空的UIView时,效果非常好, 但如果我将UILabel

  • 我以前从未使用过自动布局约束。我有一个新的小应用程序,我正在开发,并注意到NIB的视图默认为自动布局。所以,我想我会借此机会使用它,并尝试弄清楚苹果公司在这方面的进展。 第一个挑战: 我需要调整MKMapView的大小,并将其设置为新位置的动画。如果我按照我习惯的方式来做: ...然后,每当更新同级视图时,MKMapView将“捕捉”回其原始高度(在我的例子中,UISegmentedControl

  • 我是AutoLayout的新手。我已经知道很多关于这个autoLayout的问题和教程,但是我还没有找到我的解决方案。所以提前感谢您的任何帮助。 我的要求是什么? 我必须制作UIView,它将在按下屏幕底部带有动画的按钮后出现在屏幕上。(如键盘)。我使用autoLayout在xib文件中创建了此UIView。到目前为止,我已经这样做了。 在ViewDidLoad中: 在这个视图中,它包含(滚动视图

  • 我正在使用这段代码,但在iOS10上,它并没有设置动画,只是在增加和减少mySubview1的高度。为什么? 同样的代码在iOS9中工作正常

  • 许多有关自动布局约束动画的教程建议更新约束的常量属性,然后在动画块中调用。 我的处境有点棘手。我有一个包含3个子视图的视图。此超级视图的高度不是固定的-它是按其子视图的高度之和计算的。在某些情况下,我要求这3个子视图中的一个子视图切换其高度(它在0和30之间变化,即我希望平滑地隐藏和显示它)。代码类似于此: 不幸的是,这并不像我预期的那样有效。我可以看到子视图高度的平滑变化,但在为子视图高度约束设

  • 我有一组AL约束来定位一个子vc,它有两个位置,展开和折叠。 我发现,当我添加折叠约束时,带有常量的上锚到下锚约束,当第一次创建vc时,当我激活它时,似乎有额外的间距。似乎是因为当时没有实际的高度。 当我在viewDidLayoutSubviews中添加约束时,额外的间距消失了,约束行为正常。除了现在在动画中的约束之间切换时,切换到展开约束和约束打断时,无法停用折叠的约束。可能是因为在整个过渡动画