Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自动布局我可以将CenterY与顶部和底部约束结合起来吗?_Ios_Constraints_Nslayoutconstraint_Snapkit - Fatal编程技术网

Ios 自动布局我可以将CenterY与顶部和底部约束结合起来吗?

Ios 自动布局我可以将CenterY与顶部和底部约束结合起来吗?,ios,constraints,nslayoutconstraint,snapkit,Ios,Constraints,Nslayoutconstraint,Snapkit,我想让这个布局有点动感。这里的选项是动态的(未知计数),因此我们可以轻松地将这些选项放在tableView、collectionView或只是简单的scrollView中 问题是,如果可能的话,我想让这个白色容器变小,并且垂直居中。当我将centerY约束与顶部+底部插入组合时,似乎只有顶部和底部约束被激活 当选项相当长时,选项可以滚动,但保持有顶部和底部插入的事实 我已经有了一些想法,比如观察容器视图的高度是否超过设备高度 我使用snapKit,但约束应该是可以理解的。以下是我当前的布局: f

我想让这个布局有点动感。这里的选项是动态的(未知计数),因此我们可以轻松地将这些选项放在tableView、collectionView或只是简单的scrollView中

问题是,如果可能的话,我想让这个白色容器变小,并且垂直居中。当我将centerY约束与顶部+底部插入组合时,似乎只有顶部和底部约束被激活

当选项相当长时,选项可以滚动,但保持有顶部和底部插入的事实

我已经有了一些想法,比如观察容器视图的高度是否超过设备高度

我使用snapKit,但约束应该是可以理解的。以下是我当前的布局:

func setupUI() {

        self.view.backgroundColor = .clear

        self.view.addSubviews(
            self.view_BGFilter,
            self.view_Container
        )

        self.view_BGFilter.snp.makeConstraints {
            $0.edges.equalToSuperview()
        }

        self.view_Container.snp.makeConstraints {
            $0.centerY.equalToSuperview().priority(.high)
            //$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0).priority(.medium)
            $0.leading.trailing.equalToSuperview().inset(16.0)
        }

        // Setup container
        self.view_Container.addSubviews(
            self.label_Title,
            self.stackView,
            self.button_Submit
        )

        self.label_Title.snp.makeConstraints {
            $0.top.equalToSuperview().inset(40.0)
            $0.leading.trailing.equalToSuperview().inset(16.0)
        }

        self.stackView.snp.makeConstraints {
            $0.top.equalTo(self.label_Title.snp.bottom).offset(29.0)
            $0.leading.trailing.equalToSuperview().inset(24.0)
        }

        self.button_Submit.snp.makeConstraints {
            $0.height.equalTo(52.0)
            $0.top.equalTo(self.stackView.snp.bottom).offset(30.0)
            $0.bottom.leading.trailing.equalToSuperview().inset(24.0)
        }

        self.generateButtons()
    }

我回答你的问题-以顶部和底部约束为中心?-附带了一些评论

我知道SnapKit很受欢迎,我相信它有时会非常有用,特别是如果你一直使用它的话

然而。。。当你使用它时,你永远不能绝对肯定它在做什么。而且,根据我的经验,使用SnapKit的人通常并不真正理解什么是约束条件或约束条件是如何工作的(这并不意味着你就属于这种情况,…只是从各种问题中观察到的结果)

在这种特定情况下,SnapKit有一点缺陷,或者这一行不太适合期望的结果:

$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)
您可以通过简单的测试进行确认:

class TestViewController: UIViewController {

    let testView: UIView = {
        let v = UIView()
        v.backgroundColor = .red
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(testView)

        testView.snp.makeConstraints {
            $0.centerY.equalToSuperview()

            // height exactly 200 points                
            $0.height.equalTo(200.0)

            // top and bottom at least 80 points from superview
            $0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)

            $0.leading.trailing.equalToSuperview().inset(16.0)
        }

    }

}
这就是结果。。。无法同时满足约束。调试控制台中的消息:

如果我们按如下方式替换该行:

        // replace this line
        //$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)

        // with these two lines
        $0.top.greaterThanOrEqualToSuperview().offset(80.0)
        $0.bottom.lessThanOrEqualToSuperview().offset(-80.0)
这显然是在做同样的事情,我们得到了我们所期望的:

所以,SnapKit中的某些东西是可疑的

这会解决你的问题。更改
视图\u容器
约束设置,如下所示:

    self.view_Container.snp.makeConstraints {
        $0.centerY.equalToSuperview().priority(.required)

        // replace this line
        //$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)

        // with these two lines
        $0.top.greaterThanOrEqualToSuperview().offset(80.0)
        $0.bottom.lessThanOrEqualToSuperview().offset(-80.0)

        $0.leading.trailing.equalToSuperview().inset(16.0)
    }
更改前:

更改后:


关于在您有许多选项按钮时添加滚动,我可以给您一个示例,用于滚动所有内容或仅滚动选项按钮。

是否希望选项按钮**滚动(需要时),保留标题和OK按钮?或者你想让标题、选项按钮和Okaaay按钮全部滚动?很好的发现!谢谢!