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

设置子视图自动布局约束更改的动画

董高洁
2023-03-14

许多有关自动布局约束动画的教程建议更新约束的常量属性,然后在动画块中调用layoutIfNeeded()

我的处境有点棘手。我有一个包含3个子视图的视图。此超级视图的高度不是固定的-它是按其子视图的高度之和计算的。在某些情况下,我要求这3个子视图中的一个子视图切换其高度(它在0和30之间变化,即我希望平滑地隐藏和显示它)。代码类似于此:

// In superview
subview1.isVisibleInContext = !subview1.isVisibleInContext

// In subview
class MySubview: UIView {
    @IBOutlet var heightConstraint: NSLayoutConstraint!

    var isVisibleInContext = false {
        didSet {
            updateHeight()
        }
    }

    func toggleHeight() {
        let newHeight = isVisibleInContext ? 30 : 0
        layoutIfNeeded()
        heightConstraint.constant = newHeight
        UIView.animate(withDuration: 0.8) {
            self.layoutIfNeeded()
        }
    }
}

不幸的是,这并不像我预期的那样有效。我可以看到子视图高度的平滑变化,但在为子视图高度约束设置新值后,会立即重新计算超级视图的高度。

我想看到超级视图的高度随着其子视图的增加或减少而逐渐增加/减少。

请有人给我指出正确的方向。非常感谢您的帮助。

非常感谢!

共有2个答案

郭彬郁
2023-03-14

在我的方法中,第一件不正确的事情是执行self。layoutIfNeeded()。在调查了这个问题后,我了解到我必须在上级执行它,如下所示:

self.superview?.layoutIfNeeded()

这也有其原因。本例中的主要问题是,视图本身就是视图的子视图,其中包含3个子视图。因此,为了使其工作,我必须使用以下代码:

self.superview?.superview?.layoutIfNeeded()

子视图必须知道视图的层次结构,这当然不好,但它可以工作。

丰誉
2023-03-14

动画块应位于包含3个MySubviews的ui视图中。在MySubview类中,仅更新高度约束的常量:

在子视图中

func toggleHeight() {
   let newHeight = isVisibleInContext ? 30 : 0
   heightConstraint.constant = newHeight
}

然后在包含3个MySubviews的UIView中设置更改的动画:

在Superview

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

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

  • 我刚开始更彻底地使用AutoLayout,遇到了一个大问题: 我有一个视图,其中一些子视图附着在其顶部,一些子视图附着在其底部,因此当视图的高度发生变化时,子视图会相应地移动。根据用户的操作,子视图的高度可以更改(=其高度约束值更改),这可能会导致它们不再适合其父视图。 如何确定一组新的约束是否需要更改父视图的高度以适应其所有子视图?最好在我显示具有新约束的所有字段之前-我希望视图的高度同时改变。

  • 我试图在代码中生成一个视图。这是我的视图对象的层次结构 UIScrollView UIView UIButton 滚动视图应该与窗口大小相同。按钮应该尽可能大。我使用iOS自动布局,所以我所有对象的约束字符串如下所示 我还为每个对象将translatesautorexingmaskintoconstraints设置为NO。 问题是按钮只获得默认的按钮大小。其父视图对象(UIView)仅获取其子视图

  • 我有一个UIView,其中有一个UILabel作为子视图。 现在我用动画改变UIView的宽度(改变约束的常量属性)并在UIView动画中调用layoutIfNeed...( 视图正在正常调整大小,但UILabel(子视图)将字体大小更改为“结束”大小,但没有像uiview那样正确设置动画。 根据WWDC 2012会话,如果仅更改superview的常量,则子视图应设置动画。 UILabel的最小

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为