ios - 当 NavBar 滚动过去时,如何使 UIView 自动随屏幕滚动?
问题描述
当我的导航栏滚动过去时,如何使屏幕上的某个元素随屏幕滚动(ei 相对于屏幕具有固定位置)?
换句话说,我有一个不在屏幕顶部的元素,您需要先向下滚动到它的位置,然后它才能开始随屏幕滚动。然后,当您向上滚动到屏幕顶部时,该项目会回到其原始位置并停留在那里。
我目前正在使用 UIScrollView 在我的屏幕上滚动。我最初的计划是获得某些维度,并且在调用 isScrolling() 方法时基本上做这样的事情(伪代码):
if scrolledPositionOnScreen > positionOfUIView {
scrollUIViewWithRestOfScreen()
} else {
putUIViewInOriginalPosition()
}
但是,当我使用不同尺寸的屏幕时,即使我根据屏幕尺寸动态获取这些变量,这也不能很好地工作。
是否有代表或可以做我想做的事情/是否有更简单、更一致的方式?
谢谢!
解决方案
是的,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)
}
}
}
推荐阅读
- hyperledger-fabric - Endorser 截止日期前连接失败
- python - 如何处理 Python Gekko 优化中的横向条件(伴随变量 Lamda)?
- android-jetpack-compose - 是否可以不触发滚动的涟漪效应?
- python - 将矩阵与 numpy 相乘
- python - 如何将多个抓取的网址转换为单个观察?
- elastic-stack - 我在本地运行 logstash.conf 文件时遇到了一些问题
- javascript - 当我按下 signUp() 时 insert() 没有发生
- sql-server - 基于 ID 列的标志
- java - Spring Boot Jar 中 jsp 文件的类路径位置
- javascript - jQuery 将子元素的子部分元素移动到其父元素并删除其他元素