在pushViewController之后重置ScrollView contentOffset

问题描述 投票:3回答:3

我遇到了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:我已经找到了类似的问题,但是唯一可以提供帮助的问题,我无法理解,其他人有类似但不同的问题)。

谢谢

ios objective-c scrollview tableview push
3个回答
1
投票

我有同样的问题。以下是解决方案:1。我在viewWillDisappear中进行内容偏移备份2.在viewWillAppear中恢复没有动画的偏移。

更新:请确保您没有在viewWillLayoutSubviews或上述方法中调整contentSize。


1
投票

我对UItableView也有类似的问题,它也是UIScrollView,但是垂直。使用viewWillDisappear:不起作用,因为当用户启动另一个VC的推送时,iOS会发出明显的滚动。

也无法解决此问题。


1
投票

contentOffset保存viewWillDisappear备份不是正确的处理方法,如果你有一些需要在viewWillAppear上显示/隐藏的视图,你会更糟糕。

最好的方法是将contentOffset保存在scrollViewDidScroll

  1. 声明要保存偏移量的变量
var previousOffsetY: CGFloat = 0.0
var offsetLimitation: CGFloat = 50.0 // is the limit where I want to play show/hide
  1. 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
            }
        })
    }
}
  1. viewWillAppear,控制重置偏移时所需的UI。
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if previousOffsetY > offsetLimitation {
        // hide
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.