【问题标题】:How to add extra padding to UIScrollView on iPad programmatically?如何以编程方式向 iPad 上的 UIScrollView 添加额外的填充?
【发布时间】:2018-08-14 08:29:46
【问题描述】:

当设备宽度过大时,某些应用程序会在 UIScrollView 实例的左侧和右侧添加额外的填充。

重要的是,UIScrollView 的内容不限于固定宽度,因为用户可以滚动到内容之外。看起来它会设置contentInset,它会根据超级视图宽度动态变化。我怎样才能实现它?

注意

上面的屏幕没有实现为滚动视图,我只是想可视化这个概念。

【问题讨论】:

  • 如果你的视图都是居中的,那么你可以增加 containerView 的宽度给 scrollView 的大小。

标签: ios uiscrollview uikit


【解决方案1】:

如果它是一个选项,您可以调整leftrighttrailingleading)自动布局约束。

以下代码创建可水平滚动的scrollView,其中包含两个容器。第一个容器包含一个带有一些边距的子视图(红色矩形)。

Scroll View with container.

//: A UIKit based Playground for presenting user interface

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {

    private let scrollView = UIScrollView()
    private let contentView = UIView()

    override func loadView() {
        let view = UIView()
        self.view = view
        self.view.backgroundColor = UIColor.white

        scrollView.isPagingEnabled = true
        scrollView.isScrollEnabled = true
        scrollView.isUserInteractionEnabled = true
        scrollView.bounces = true
        self.view.addSubview(scrollView)

        scrollView.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),
            scrollView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
            scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            scrollView.rightAnchor.constraint(equalTo: self.view.rightAnchor)
            ])

        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.backgroundColor = UIColor(white: 0.9, alpha: 0.9)
        scrollView.addSubview(contentView)

        let widthAnchor = contentView.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
        let heightAnchor = contentView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
        widthAnchor.priority = .defaultLow
        heightAnchor.priority = .defaultLow

        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
            contentView.leftAnchor.constraint(equalTo: scrollView.leftAnchor),
            contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
            contentView.rightAnchor.constraint(equalTo: scrollView.rightAnchor),
            widthAnchor,
            heightAnchor
            ])

        contentView.layer.borderWidth = 1
        contentView.layer.borderColor = UIColor.red.cgColor

        let containerView1 = UIView()
        containerView1.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(containerView1)
        containerView1.backgroundColor = UIColor(white: 0.4, alpha: 1)

        NSLayoutConstraint.activate([
            containerView1.topAnchor.constraint(equalTo: contentView.topAnchor),
            containerView1.leftAnchor.constraint(equalTo: contentView.leftAnchor),
            containerView1.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
            containerView1.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
            ])

        let container1Content = container1ContentView()
        containerView1.addSubview(container1Content)
        NSLayoutConstraint.activate([
            container1Content.topAnchor.constraint(equalTo: containerView1.topAnchor, constant: 44),
            container1Content.leftAnchor.constraint(equalTo: containerView1.leftAnchor, constant: 44),
            container1Content.rightAnchor.constraint(equalTo: containerView1.rightAnchor, constant: -44),
            container1Content.bottomAnchor.constraint(equalTo: containerView1.bottomAnchor, constant: -44)
            ])


        let containerView2 = UIView()
        containerView2.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(containerView2)
        containerView2.backgroundColor =  UIColor(white: 0.9, alpha: 1)

        NSLayoutConstraint.activate([
            containerView2.topAnchor.constraint(equalTo: contentView.topAnchor),
            containerView2.leftAnchor.constraint(equalTo: containerView1.rightAnchor),
            containerView2.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
            containerView2.rightAnchor.constraint(equalTo: contentView.rightAnchor),
            containerView2.widthAnchor.constraint(equalTo: scrollView.widthAnchor)
            ])
    }

    private func container1ContentView() -> UIView {
        let content = UIView()
        content.translatesAutoresizingMaskIntoConstraints = false
        content.backgroundColor = UIColor.red
        return content
    }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

【讨论】:

  • 正如我提到的,用户甚至可以在UIScrollView 内容之外滚动。这意味着不能使用约束的边距。
  • scrollView应该分页吗?如果是这样,那么可以添加一个容器视图,并为其内容添加内部约束。
  • 你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2012-03-29
  • 2012-02-29
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多