我遇到了ScrollView的问题,我的scrollView有640的宽度,从0到320它是一个mapView,从320到640它是一个tableView。我有一个segmentedButton有2个选项,可以将我的视图从contentOffset从0切换到320。问题是,如果我在x中切换到320的contentOffset并按下tableView的单元格,在释放按钮以推送其他viewController后,我的scrollView的contentOffset在x中重置为0。我需要在tableView上保持contentOffset,在320 x。我尝试了很多东西,比如使用viewWillDisappear和生命周期方法。我能够达到的最接近的是在按下后再回到tableView。虽然,我无法让它停留在tableView上推送下一个viewController。
任何帮助表示赞赏!
(Ps:我已经找到了类似的问题,但是唯一可以提供帮助的问题,我无法理解,其他人有类似但不同的问题)。
谢谢
我有同样的问题。以下是解决方案:1。我在viewWillDisappear中进行内容偏移备份2.在viewWillAppear中恢复没有动画的偏移。
更新:请确保您没有在viewWillLayoutSubviews或上述方法中调整contentSize。
我对UItableView也有类似的问题,它也是UIScrollView,但是垂直。使用viewWillDisappear:不起作用,因为当用户启动另一个VC的推送时,iOS会发出明显的滚动。
也无法解决此问题。
在contentOffset
保存viewWillDisappear
备份不是正确的处理方法,如果你有一些需要在viewWillAppear
上显示/隐藏的视图,你会更糟糕。
最好的方法是将contentOffset
保存在scrollViewDidScroll
- 声明要保存偏移量的变量
var previousOffsetY: CGFloat = 0.0
var offsetLimitation: CGFloat = 50.0 // is the limit where I want to play show/hide
- 在
UIScrollViewDelegate
里面是scrollViewDidScroll
,保存偏移量。
extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
previousOffsetY = scrollView.contentOffset.y
UIView.animate(withDuration: 0.5, animations: {
if offset <= self.offsetLimitation {
// show
} else {
// hide
}
})
}
}
- 在
viewWillAppear
,控制重置偏移时所需的UI。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if previousOffsetY > offsetLimitation {
// hide
}
}