首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当滚动视图动画化时获取偏移量

当滚动视图动画化时获取偏移量
EN

Stack Overflow用户
提问于 2021-05-25 07:37:11
回答 1查看 103关注 0票数 0

我有一个充满活力的焦焦景色。

代码语言:javascript
复制
       UIView.animate(withDuration: Double(totalMidiTime) / 1000, delay: 0, options: .curveLinear) {
            self.scrollView.contentOffset.x = self.scrollView.contentSize.width - self.leftMargin
        } completion: { (_) in }

我想得到当前位置偏移,当它是动画

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 13:33:02

您可以通过检查滚动视图的bounds.origin.x值来获得偏移量

代码语言:javascript
复制
guard let pl = scrollView.layer.presentation() else {
    return
}
print("Content Offset X:", pl.bounds.origin.x)

这里有一个完整的例子..。

我们创建一个有30个标签的滚动视图。在viewDidAppear上,我们启动一个20秒的水平动画到最后一个标签.每次我们点击按钮时,“状态标签”将使用滚动视图表示层的当前bounds.origin.x更新(与contentOffset.x匹配):

代码语言:javascript
复制
class ViewController: UIViewController {

    let scrollView: UIScrollView = {
        let v = UIScrollView()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .systemGreen
        return v
    }()
    
    let testButton: UIButton = {
        let v = UIButton()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.backgroundColor = .blue
        v.setTitle("Get Offset", for: [])
        v.setTitleColor(.lightGray, for: .highlighted)
        return v
    }()
    
    let statusLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.numberOfLines = 0
        v.textAlignment = .center
        v.text = "Content Offset X\n0.00"
        return v
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let stack = UIStackView()
        stack.distribution = .fillEqually
        stack.spacing = 8
        stack.translatesAutoresizingMaskIntoConstraints = false
        
        for i in 1...30 {
            let v = UILabel()
            v.backgroundColor = .yellow
            v.text = "Label \(i)"
            v.textAlignment = .center
            stack.addArrangedSubview(v)
        }
        
        scrollView.addSubview(stack)
        view.addSubview(scrollView)
        view.addSubview(testButton)
        view.addSubview(statusLabel)
        
        let g = view.safeAreaLayoutGuide
        let cg = scrollView.contentLayoutGuide
        let fg = scrollView.frameLayoutGuide
        
        NSLayoutConstraint.activate([
            
            scrollView.topAnchor.constraint(equalTo: g.topAnchor, constant: 20.0),
            scrollView.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 20.0),
            scrollView.trailingAnchor.constraint(equalTo: g.trailingAnchor, constant: -20.0),
            scrollView.heightAnchor.constraint(equalToConstant: 60.0),
            
            stack.topAnchor.constraint(equalTo: cg.topAnchor, constant: 8.0),
            stack.leadingAnchor.constraint(equalTo: cg.leadingAnchor, constant: 8.0),
            stack.trailingAnchor.constraint(equalTo: cg.trailingAnchor, constant: -8.0),
            stack.bottomAnchor.constraint(equalTo: cg.bottomAnchor),

            stack.heightAnchor.constraint(equalTo: fg.heightAnchor, constant: -16.0),
            
            testButton.topAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 20.0),
            testButton.centerXAnchor.constraint(equalTo: g.centerXAnchor),
            testButton.widthAnchor.constraint(equalTo: g.widthAnchor, multiplier: 0.6),
            
            statusLabel.topAnchor.constraint(equalTo: testButton.bottomAnchor, constant: 20.0),
            statusLabel.centerXAnchor.constraint(equalTo: g.centerXAnchor),
            statusLabel.widthAnchor.constraint(equalTo: g.widthAnchor, multiplier: 0.9),
            
        ])
        
        testButton.addTarget(self, action: #selector(gotTap(_:)), for: .touchUpInside)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        UIView.animate(withDuration: 20.0, delay: 0, options: .curveLinear) {
            self.scrollView.contentOffset.x = self.scrollView.contentSize.width - self.scrollView.frame.width
        } completion: { (_) in }
        
    }
    
    @objc func gotTap(_ sender: UIButton) -> Void {
        guard let pl = scrollView.layer.presentation() else {
            return
        }
        let x = String(format: "%0.2f", pl.bounds.origin.x)
        statusLabel.text = "Content Offset X\n\(x)"
    }
    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67683614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档