【发布时间】:2019-02-03 09:19:00
【问题描述】:
我正在制作一个具有 UIScrollView 的应用程序,该 UIScrollView 展开到 280 的高度,并在关闭时收缩到 0 的高度。我使用了滚动视图,因为常规视图不会在动画到 0 高度后“隐藏”其子视图。最初,在滚动视图的任何动画发生之前,子视图会按预期响应触摸,但在视图的高度完全被动画化后,所有子视图都会停止响应用户触摸。我已经尝试确保所有子视图的 zPosition 大于视图控制器中的任何其他视图,所以这不是问题。似乎所有子视图的框架都在它们的父视图内。以下是我的问题视频的链接:
这是按下“parametersButton”时发生的代码:
@IBAction func parametersButtonPressed(_ sender: Any) {
UIView.animate(withDuration: 0.25, animations: {
if self.parametersExpanded {
//Close searchView, make shadowView transparent
self.searchView.frame.size.height = 0
self.parametersButton.frame = self.parametersButton.frame.offsetBy(dx: 0, dy: -280)
self.searchView.backgroundColor = UIColor.darkGray
self.shadowView.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0)
} else {
//Expand the searchView, darken shadowView
self.searchView.frame.size.height = 280
self.parametersButton.frame = self.parametersButton.frame.offsetBy(dx: 0, dy: 280)
self.searchView.backgroundColor = UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1)
self.shadowView.layer.zPosition = 990
self.shadowView.backgroundColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.868)
}
}) { (bool) in
}
}
请注意,在我的应用程序中,searchView 最初是被关闭的,即帧高度为 0。对于这个演示,我已经做到了,当应用程序第一次加载时,视图会展开,这样我就可以演示子视图在其 superView 动画之前响应。此外,我使用 shadowView 将其后面的视图变暗,但它非常明显地位于 searchView 后面,所以这不是问题。
【问题讨论】:
-
“常规视图不会“隐藏”其子视图” ...您是否在“常规视图”上设置了
.clipsToBounds = true? -
@DonMag 让我用常规视图替换滚动视图,将 clipsToBounds 设置为 true 并回复您
-
@DonMag 将视图更改为具有 clipsToBounds 等于 true 的 UIView,虽然子视图现在消失了,但问题仍然存在,即当视图最初打开时,子视图是响应式的,但在关闭并重新打开后,它们不再响应触摸。
-
如果您注释掉所有
.isUserInteractionEnabled = false行,按钮在关闭/打开时是否响应触摸? -
作为旁注,我不认为
.layer.zPosition行正在做你认为他们正在做的事情.......zPosition属性与 控件的内部层,而不是视图/按钮/滑块等的“z-order”。
标签: ios swift uiview uiscrollview uiviewanimation