Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 在两个锚之间居中_Ios_Swift_Autolayout_Anchor - Fatal编程技术网

Ios 在两个锚之间居中

Ios 在两个锚之间居中,ios,swift,autolayout,anchor,Ios,Swift,Autolayout,Anchor,我想在两个锚定之间设置一个中心锚定。与此类似: centeredLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor), 但是,我不希望它相对于屏幕居中。我希望它正好在屏幕上的两个其他锚之间。就像我在顶部有一个工具栏,如下所示: toolbar.topAnchor.constraint(equalTo: view.topAnchor), button.bottomAnchor.constraint(equalTo: guide.

我想在两个锚定之间设置一个
中心锚定。与此类似:

centeredLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor),
但是,我不希望它相对于屏幕居中。我希望它正好在屏幕上的两个其他锚之间。就像我在顶部有一个工具栏,如下所示:

toolbar.topAnchor.constraint(equalTo: view.topAnchor),
button.bottomAnchor.constraint(equalTo: guide.bottomAnchor, constant: -20)
然后我在底部有一个按钮,如下所示:

toolbar.topAnchor.constraint(equalTo: view.topAnchor),
button.bottomAnchor.constraint(equalTo: guide.bottomAnchor, constant: -20)
有没有方法可以将
centeredLabel
的y约束居中放置在
工具栏的底部定位点和
按钮的顶部定位点之间

是否有一种方法可以将centeredLabel的y约束居中放置在工具栏的底部定位点和按钮的顶部定位点之间

是的,有。简单的方法是使用一个透明的间隔视图,其顶部锚定到上部锚定,底部锚定到下部锚定。现在,将标签居中定位到间隔视图的中心

然而,尽管这很简单,但并不是最好的方法。最好的方法是创建自定义视图,而不是透明的间隔视图。不幸的是,这只能在代码中完成,而不能在情节提要中完成(而间隔视图和标签可以完全在情节提要中配置)。但是它的优点是,它不会给渲染树增加额外的视图负担

这是您的情况,或多或少,使用按钮作为上视图,使用按钮作为下视图。标签在它们之间垂直居中:

下面是产生这种情况的代码
b1
b2
是按钮(无论它们是如何创建和定位的):

是否有一种方法可以将centeredLabel的y约束居中放置在工具栏的底部定位点和按钮的顶部定位点之间

是的,有。简单的方法是使用一个透明的间隔视图,其顶部锚定到上部锚定,底部锚定到下部锚定。现在,将标签居中定位到间隔视图的中心

然而,尽管这很简单,但并不是最好的方法。最好的方法是创建自定义视图,而不是透明的间隔视图。不幸的是,这只能在代码中完成,而不能在情节提要中完成(而间隔视图和标签可以完全在情节提要中配置)。但是它的优点是,它不会给渲染树增加额外的视图负担

这是您的情况,或多或少,使用按钮作为上视图,使用按钮作为下视图。标签在它们之间垂直居中:

下面是产生这种情况的代码
b1
b2
是按钮(无论它们是如何创建和定位的):

虽然的解决方案可行,但这里有一个更简单的解决方案,它使用autolayout,而无需创建UILayoutGuide

iOS 10通过
nslayoutxaxissanch.anchorWithOffset(to:)
nslayoutyaxissanch.anchorWithOffset(to:)
介绍了一种简单的方法

这里有一些方便的方法来总结这个逻辑

用于X轴定心

extension NSLayoutXAxisAnchor {
    func constraint(between anchor1: NSLayoutXAxisAnchor, and anchor2: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
extension NSLayoutYAxisAnchor {
    func constraint(between anchor1: NSLayoutYAxisAnchor, and anchor2: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
用于Y轴定心

extension NSLayoutXAxisAnchor {
    func constraint(between anchor1: NSLayoutXAxisAnchor, and anchor2: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
extension NSLayoutYAxisAnchor {
    func constraint(between anchor1: NSLayoutYAxisAnchor, and anchor2: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
要执行您需要的操作,您可以致电:

centeredLabel.centerYAnchor.constraint(between: toolbar.bottomAnchor, and: button.topAnchor)
虽然的解决方案可行,但这里有一个更简单的解决方案,它使用autolayout,而无需创建UILayoutGuide

iOS 10通过
nslayoutxaxissanch.anchorWithOffset(to:)
nslayoutyaxissanch.anchorWithOffset(to:)
介绍了一种简单的方法

这里有一些方便的方法来总结这个逻辑

用于X轴定心

extension NSLayoutXAxisAnchor {
    func constraint(between anchor1: NSLayoutXAxisAnchor, and anchor2: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
extension NSLayoutYAxisAnchor {
    func constraint(between anchor1: NSLayoutYAxisAnchor, and anchor2: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
用于Y轴定心

extension NSLayoutXAxisAnchor {
    func constraint(between anchor1: NSLayoutXAxisAnchor, and anchor2: NSLayoutXAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
extension NSLayoutYAxisAnchor {
    func constraint(between anchor1: NSLayoutYAxisAnchor, and anchor2: NSLayoutYAxisAnchor) -> NSLayoutConstraint {
        let anchor1Constraint = anchor1.anchorWithOffset(to: self)
        let anchor2Constraint = anchorWithOffset(to: anchor2)
        return anchor1Constraint.constraint(equalTo: anchor2Constraint)
    }
}
要执行您需要的操作,您可以致电:

centeredLabel.centerYAnchor.constraint(between: toolbar.bottomAnchor, and: button.topAnchor)

凉的我本打算向您详细介绍故事板解决方案,但您会发现UILayoutGuide正是您所需要的。这是一组类似于视图的锚点,没有实际视图。正如文档所说,“使用布局指南替换您可能创建的虚拟视图,以表示用户界面中的视图间空间或封装。”这正是您应该拥有的“视图间空间”。您如何看待将视图放在堆栈视图中,并在具有视图的堆栈上下创建堆栈?然后将底部堆叠的高度设置为与顶部堆叠的高度相等,以使物品居中?那也很好吗?还是布局指南更好?酷!我本打算向您详细介绍故事板解决方案,但您会发现UILayoutGuide正是您所需要的。这是一组类似于视图的锚点,没有实际视图。正如文档所说,“使用布局指南替换您可能创建的虚拟视图,以表示用户界面中的视图间空间或封装。”这正是您应该拥有的“视图间空间”。您如何看待将视图放在堆栈视图中,并在具有视图的堆栈上下创建堆栈?然后将底部堆叠的高度设置为与顶部堆叠的高度相等,以使物品居中?那也很好吗?还是布局指南更好?