【问题标题】:How to Make a UIButton fix at UIScrollView?如何在 UIScrollView 上修复 UIButton?
【发布时间】:2017-11-15 11:36:39
【问题描述】:

我的 UIScrollView 上有一个 UIButton,当我缩放滚动视图时,按钮位置不固定...有没有办法让它固定在一个位置?

【问题讨论】:

    标签: ios uiscrollview zooming


    【解决方案1】:

    从 iOS 11 开始,UIScrollView 有一个名为 frameLayoutGuide 的实例属性。 frameLayoutGuide 有以下声明:

    var frameLayoutGuide: UILayoutGuide { get }
    

    基于滚动视图未变形框架矩形的布局指南。

    当您想要创建明确涉及滚动视图本身的框架矩形而不是其内容矩形的自动布局约束时,请使用此布局指南。


    以下 Swift 5.1 / iOS 13 UIViewController 实现展示了如何使用 frameLayoutGuideUIButton 居中在 UIScrollView 中。

    import UIKit
    
    class ViewController: UIViewController {
    
        let scrollView = UIScrollView()
        let button = UIButton(type: .system)
        let imageView = UIImageView(image: UIImage(named: "LargeImage"))
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Set scrollView constraints
            scrollView.contentInsetAdjustmentBehavior = .never
            view.addSubview(scrollView)
            scrollView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
                scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
                scrollView.topAnchor.constraint(equalTo: view.topAnchor),
                scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
            ])
    
            // Set imageView constraints
            scrollView.addSubview(imageView)
            imageView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                imageView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
                imageView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
                imageView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
                imageView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)
            ])
    
            // Set button constraints (centered)
            button.setTitle("Button", for: .normal)
            scrollView.addSubview(button)
            button.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                button.centerXAnchor.constraint(equalTo: scrollView.frameLayoutGuide.centerXAnchor),
                button.centerYAnchor.constraint(equalTo: scrollView.frameLayoutGuide.centerYAnchor)
            ])
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      将您的按钮放置/设置在滚动视图上(不在滚动视图内),如此处快照所示。并且还针对滚动视图的超级视图设置按钮约束(位置)。

      这里是参考。每个视图的位置层次结构快照。

      【讨论】:

        【解决方案3】:

        如果您希望您的按钮在修改滚动视图时保持固定的大小和位置,最好的方法是根本不在滚动视图中。将按钮添加到scrollview的父view,那么它就不会受到scrollview的任何更改的影响,并且可以覆盖在它上面。

        【讨论】:

        • 这是最简单的方法吗?
        • 是的,这是迄今为止最简单的方法。否则,您将需要实现 scrollViewDidScroll: 以在滚动视图滚动时更改按钮的位置以使其显示为静态,并实现 scrollViewDidZoom: 以在滚动视图缩放时重置按钮的转换以使其看起来保持不变大小相同。这更昂贵并且需要更多的工作来实施。如果在UIScrollView 层次结构之外添加按钮,则不需要额外的工作。
        【解决方案4】:

        您应该将按钮放置在滚动视图之外并将其锚定到页面底部。这样,滚动视图中的内容将发生变化,但您的按钮将保持静态固定在视图上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 2013-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-31
          • 1970-01-01
          相关资源
          最近更新 更多