UIScrollView 的子视图不响应滚动视图高度动画后的触摸
Subviews of UIScrollView not responding to touch following animation of Scroll View's height
我正在制作一个应用程序,它有一个 UIScrollView,它会扩展到 280 的高度,并在关闭时收缩到 0 的高度。我使用了滚动视图,因为常规视图不会 "hide" 它的子视图在动画后达到 0 高度。最初,在滚动视图的任何动画发生之前,子视图按预期响应触摸,但在视图的高度完全动画之后,所有子视图停止响应用户触摸。我已经尝试确保所有子视图的 zPosition 都大于视图控制器中的任何其他视图,所以这不是问题。看起来所有子视图的框架都在它们的超级视图中。以下是关于我的问题的视频 link:
这是按下 "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 后面,所以这不是问题。
根据 OP 评论...
可能的问题是由于显式更改了视图元素的框架,这些框架是使用自动布局约束设置的。常见问题,并可能导致各种奇怪的错误/情况。
将动画视图折叠/展开方法更改为更改约束属性而不是显式帧更改解决了该问题。
我正在制作一个应用程序,它有一个 UIScrollView,它会扩展到 280 的高度,并在关闭时收缩到 0 的高度。我使用了滚动视图,因为常规视图不会 "hide" 它的子视图在动画后达到 0 高度。最初,在滚动视图的任何动画发生之前,子视图按预期响应触摸,但在视图的高度完全动画之后,所有子视图停止响应用户触摸。我已经尝试确保所有子视图的 zPosition 都大于视图控制器中的任何其他视图,所以这不是问题。看起来所有子视图的框架都在它们的超级视图中。以下是关于我的问题的视频 link:
这是按下 "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 后面,所以这不是问题。
根据 OP 评论...
可能的问题是由于显式更改了视图元素的框架,这些框架是使用自动布局约束设置的。常见问题,并可能导致各种奇怪的错误/情况。
将动画视图折叠/展开方法更改为更改约束属性而不是显式帧更改解决了该问题。