首页 > 解决方案 > 当 NavBar 滚动过去时,如何使 UIView 自动随屏幕滚动?

问题描述

当我的导航栏滚动过去时,如何使屏幕上的某个元素随屏幕滚动(ei 相对于屏幕具有固定位置)?

换句话说,我有一个不在屏幕顶部的元素,您需要先向下滚动到它的位置,然后它才能开始随屏幕滚动。然后,当您向上滚动到屏幕顶部时,该项目会回到其原始位置并停留在那里。

我目前正在使用 UIScrollView 在我的屏幕上滚动。我最初的计划是获得某些维度,并且在调用 isScrolling() 方法时基本上做这样的事情(伪代码):

if scrolledPositionOnScreen > positionOfUIView {
   scrollUIViewWithRestOfScreen()
} else {
   putUIViewInOriginalPosition()
}

但是,当我使用不同尺寸的屏幕时,即使我根据屏幕尺寸动态获取这些变量,这也不能很好地工作。

是否有代表或可以做我想做的事情/是否有更简单、更一致的方式?

谢谢!

标签: iosswiftxcodeuikit

解决方案


是的,UIScrollViewDelegate您可以使用该scrollViewDidScroll方法的委托:

class ViewController : UIViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()
    let frame = CGRect(origin: .init(x: 0, y: 100), size: .init(width: 200, height: 200))
    lazy var v = UIView(frame: frame)
    override func viewDidLoad() {
        super.viewDidLoad()
        self.scrollView.delegate = self
        self.view.addSubview(scrollView)
        self.scrollView.contentSize = CGSize(width: self.view.bounds.width, height: UIScreen.main.bounds.height + 1000)
        self.scrollView.translatesAutoresizingMaskIntoConstraints = false
        
        self.scrollView.addSubview(v)
        self.v.backgroundColor = .red
        
        NSLayoutConstraint.activate([
            self.scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),
            self.scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            self.scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            self.scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
        ])
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.contentOffset.y > frame.origin.y {
            v.center.y = scrollView.contentOffset.y + (v.bounds.height/2)
        }
    }
}

推荐阅读