根据 UIScrollView 的内容对其高度进行动画处理



我的情况:

我有一个包含StackView的水平滚动视图。在这个StackView中有一些视图,可以展开/折叠。

当我想展开其中一个视图时,我首先取消隐藏视图中的一些子视图。之后,我需要根据此视图的新高度更改ScrollView的高度。

但这不起作用。。。

我尝试这个代码:

UIView.animate(withDuration: 0.3) { [self] in
// Toggle hight of all subViews
stackView.arrangedSubviews.forEach { itemView in
guard let itemView = itemView as? MyView else { return }
itemView.toggleView()
}

// Now update the hight of the StackView
// But here the hight is always from the previous toggle
let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0
print(height)
heightConstraint.constant = height
}

这段代码很好地设置了动画,但总是达到错误的高度。因此,ScrollView在应该展开时设置为折叠动画,在应该折叠时设置为展开动画。

有人知道如何解决这个问题吗?

问题是,无论你在这里做什么:

itemView.toggleView()

可能已经做了一些改变视图高度的事情,但随后您立即致电:

let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0

UIKit更新帧之前。

因此,您可以跟踪自己的高度属性,或者。。。

在更新后获取帧高度,例如:

DispatchQueue.main.async {
let height = self.stackView.arrangedSubviews.map {$0.frame.size.height}.max() ?? 0.0
print("h", height)
self.scrollHeightConstraint.constant = height
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
}

相关内容

  • 没有找到相关文章

最新更新