【问题标题】:Property preservesSuperviewLayoutMargins is ignored in UIStackView属性 preservesSuperviewLayoutMargins 在 UIStackView 中被忽略
【发布时间】:2021-01-15 06:15:05
【问题描述】:

我正在尝试在滚动视图中创建一个堆栈视图,该视图尊重超级视图的布局边距。所以我将preservesSuperviewLayoutMargins 设置为true,并提出以下代码:

import UIKit

class ViewController: UIViewController {
    let stackView: UIStackView = {
        let sv = UIStackView()
        sv.axis = .vertical
        sv.preservesSuperviewLayoutMargins = true
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()

    let scrollView: UIScrollView = {
        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        sv.alwaysBounceVertical = true
        sv.preservesSuperviewLayoutMargins = true
        return sv
    }()

    override func viewDidLoad() {
        view.layoutMargins = UIEdgeInsets(top: 0, left: 64, bottom: 0, right: 64)
        view.addSubview(scrollView)

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

        let l = UILabel()
        l.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Itaque his sapiens semper vacabit. An est aliquid, quod te sua sponte delectet? Aliud igitur esse censet gaudere, aliud non dolere. Quasi ego id curem, quid ille aiat aut neget. Cur post Tarentum ad Archytam? Duo Reges: constructio interrete. Atque etiam valítudinem, vires, vacuitatem doloris non propter utilitatem solum, sed etiam ipsas propter se expetemus. Naturales divitias dixit parabiles esse, quod parvo esset natura contenta."
        l.numberOfLines = 0
        l.translatesAutoresizingMaskIntoConstraints = false

        stackView.addArrangedSubview(l)
        super.viewDidLoad()
    }
}


但是,lorem ipsum 文本完全忽略了左侧 64 和右侧 64 的边距。

我在这里错过了什么?

【问题讨论】:

    标签: ios uiscrollview uikit uistackview


    【解决方案1】:

    默认情况下,堆栈视图的排列的子视图通过堆栈视图的边缘...而不是边距进行约束。

    您可以通过将堆栈视图的 .isLayoutMarginsRelativeArrangement 属性设置为 true 来解决此问题:

    let stackView: UIStackView = {
        let sv = UIStackView()
        sv.axis = .vertical
        sv.preservesSuperviewLayoutMargins = true
        sv.translatesAutoresizingMaskIntoConstraints = false
    
        // add this line
        sv.isLayoutMarginsRelativeArrangement = true
    
        return sv
    }()
    

    【讨论】:

    • 我知道事情就是这么简单。谢谢!!
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多