首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从开关柜中获取NSLayoutAnchor?

如何从开关柜中获取NSLayoutAnchor?
EN

Stack Overflow用户
提问于 2017-05-19 11:46:30
回答 1查看 454关注 0票数 0

我想做一些类似的事情:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2017-05-19 17:25:17

Swift需要能够在编译时确定类型,但是您尝试根据传递的edge参数返回NSLayoutAnchor<NSLayoutXAxisAnchor>NSLayoutAnchor<NSLayoutYAxisAnchor>对象。

你可以做的是将你的边分割成与x轴和y轴相关的边:

代码语言:javascript
复制
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已经为您准备好的东西:)。

这就是为什么我认为你在这里与系统背道而驰。后退一步,为什么不直接使用锚点呢?

代码语言:javascript
复制
extension UIView
{
    func useAnchors(view: UIView)
    {
        _ = rightAnchor.constraint(equalTo: view.rightAnchor)
        _ = topAnchor.constraint(equalTo: view.bottomAnchor)
    }
}

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

代码语言:javascript
复制
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)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44061108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档