【发布时间】:2017-11-15 11:36:39
【问题描述】:
我的 UIScrollView 上有一个 UIButton,当我缩放滚动视图时,按钮位置不固定...有没有办法让它固定在一个位置?
【问题讨论】:
标签: ios uiscrollview zooming
我的 UIScrollView 上有一个 UIButton,当我缩放滚动视图时,按钮位置不固定...有没有办法让它固定在一个位置?
【问题讨论】:
标签: ios uiscrollview zooming
从 iOS 11 开始,UIScrollView 有一个名为 frameLayoutGuide 的实例属性。 frameLayoutGuide 有以下声明:
var frameLayoutGuide: UILayoutGuide { get }
基于滚动视图未变形框架矩形的布局指南。
当您想要创建明确涉及滚动视图本身的框架矩形而不是其内容矩形的自动布局约束时,请使用此布局指南。
以下 Swift 5.1 / iOS 13 UIViewController 实现展示了如何使用 frameLayoutGuide 将 UIButton 居中在 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)
])
}
}
【讨论】:
如果您希望您的按钮在修改滚动视图时保持固定的大小和位置,最好的方法是根本不在滚动视图中。将按钮添加到scrollview的父view,那么它就不会受到scrollview的任何更改的影响,并且可以覆盖在它上面。
【讨论】:
scrollViewDidScroll: 以在滚动视图滚动时更改按钮的位置以使其显示为静态,并实现 scrollViewDidZoom: 以在滚动视图缩放时重置按钮的转换以使其看起来保持不变大小相同。这更昂贵并且需要更多的工作来实施。如果在UIScrollView 层次结构之外添加按钮,则不需要额外的工作。
您应该将按钮放置在滚动视图之外并将其锚定到页面底部。这样,滚动视图中的内容将发生变化,但您的按钮将保持静态固定在视图上。
【讨论】: