gpt4 book ai didi

swift - 如何从开关盒中获取 NSLayoutAnchor?

转载 作者:行者123 更新时间:2023-11-28 15:38:20 31 4
gpt4 key购买 nike

我想做这样的事情:

public enum LayoutEdge
{
case top
case right
...
}

func anchorForLayoutEdge(_ edge : LayoutEdge) -> NSLayoutAnchor {
switch edge
{
case .top: return topAnchor
case .right: return rightAnchor
...
}
}

public func constrain_edge(_ edge : LayoutEdge,
toEdge : LayoutEdge,
view : UIView) -> NSLayoutConstraint{
let a1 = anchorForLayoutEdge(edge)
let a2 = anchorForLayoutEdge(toEdge)
return a1.constraint(equalTo: a2))
}

但这不编译。它在 anchorForLayoutEdge 中失败。 Xcode 建议将返回类型更改为 NSLayoutAnchor,这似乎是错误的。我怎样才能让它根据指定的边缘返回正确的 NSLayoutXAxisAnchorNSLayoutYAxisAnchor

最佳答案

Swift 需要能够在编译时确定类型,但您尝试返回 NSLayoutAnchor<NSLayoutXAxisAnchor>NSLayoutAnchor<NSLayoutYAxisAnchor>对象取决于通过了edge参数。

可以做的是将您的边拆分为与 x 轴和 y 轴相关的边:

extension UIView
{
public enum XLayoutEdge {
case right
// ...
}

public enum YLayoutEdge {
case top
// ...
}

func anchor(for edge: XLayoutEdge) -> NSLayoutAnchor<NSLayoutXAxisAnchor> {
switch edge
{
case .right: return rightAnchor
// ...
}
}

func anchor(for edge: YLayoutEdge) -> NSLayoutAnchor<NSLayoutYAxisAnchor> {
switch edge
{
case .top: return topAnchor
// ...
}
}

public func constrain(edge edge1: XLayoutEdge, to edge2: XLayoutEdge, of view: UIView) -> NSLayoutConstraint {
return anchor(for: edge1).constraint(equalTo: view.anchor(for: edge2))
}

public func constrain(edge edge1: YLayoutEdge, to edge2: YLayoutEdge, of view: UIView) -> NSLayoutConstraint {
return anchor(for: edge1).constraint(equalTo: view.anchor(for: edge2))
}

func useEdges(view: UIView)
{
_ = constrain(edge: .right, to: .right, of: view)
_ = constrain(edge: .top, to: .top, of: view)
}
}

情况会变得更糟,因为您必须考虑 NSLayoutDimension , 也。你可以玩泛型但你最终可能会以某种方式复制 Apple 已经为你准备好的东西 :)。

这就是为什么我认为您在这里与系统作对。退一步说,为什么不直接使用 anchor 呢?

extension UIView
{
func useAnchors(view: UIView)
{
_ = rightAnchor.constraint(equalTo: view.rightAnchor)
_ = topAnchor.constraint(equalTo: view.bottomAnchor)
}
}

如果你想编写自己的便利函数,你可以这样做:

extension UIView
{
public func constrain<T>(_ anchor1: NSLayoutAnchor<T>, to anchor2: NSLayoutAnchor<T>) -> NSLayoutConstraint {
return anchor1.constraint(equalTo: anchor2)
}

func useYourOwnFunctions(view: UIView)
{
_ = constrain(rightAnchor, to: view.rightAnchor)
_ = constrain(topAnchor, to: view.bottomAnchor)
}
}

关于swift - 如何从开关盒中获取 NSLayoutAnchor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44061108/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com