【问题标题】:Is there an alternative way to convert coordinates for rects?有没有另一种方法来转换矩形坐标?
【发布时间】:2016-09-13 18:22:51
【问题描述】:

我掉进了一个陷阱,重构一切已经来不及了。由于这里解释的时间太长(但它们是有效的并且代码库工作正常),我不得不抽象出 UIImageViews 作为其中一种方法的返回类型,而我只返回一个协议。 这个协议叫做Viewable,只有5个属性。

    protocol Viewable {

        var image: UIImage { get }
        var bounds: CGRect { get }
        var center: CGPoint { get }
        var contentMode: UIViewContentMode { get }
        var hidden: Bool { get set }
    }

可见视图是在UIView 层次结构中可见的视图,没有什么特别之处。问题如下:

我需要扩展这个协议,这样我就可以有一个语义更好的便捷方法,可以计算不同父坐标系中可视对象的坐标。

对于普通的UIView,代码看起来像这样,并且运行良好。

 extension UIView {

     func frame(inCoordinatesOfView parentView: UIView) -> CGRect {

            let frameInWindow = UIApplication.applicationWindow.convertRect(self.bounds, fromView: self)
            return parentView.convertRect(frameInWindow, fromView: UIApplication.applicationWindow)
    }
}

但是当我这样做时

extension Viewable {

     func frame(inCoordinatesOfView parentView: UIView) -> CGRect {

            let frameInWindow = UIApplication.applicationWindow.convertRect(self.bounds, fromView: self)
            return parentView.convertRect(frameInWindow, fromView: UIApplication.applicationWindow)
    }
}

当然它不起作用,因为fromView:self 部分无法编译。那里的类​​型应该是UIView 而不是Viewable

回到我的标题,有没有一种方法可以计算坐标而不需要引用 UIViews,而是一个纯数学公式,只处理 CGRects 和 CGPoints?

【问题讨论】:

    标签: ios swift uiview


    【解决方案1】:

    尝试以这种方式扩展协议:

    extension Viewable where Self: UIView {
    
            func frame(inCoordinatesOfView parentView: UIView) -> CGRect {
    
                let frameInWindow = UIApplication.applicationWindow.convertRect(self.bounds, fromView: self)
                return parentView.convertRect(frameInWindow, fromView: UIApplication.applicationWindow)
            }
        }
    

    我自己没有测试过,但应该可以。让我知道发生什么事。

    extension Viewable where Self: UIView {
    

    只有在符合的 Type 是 UIView 时才会添加功能

    。在这种情况下,有一个convertRect,因此扩展不会出错。

    【讨论】:

    • 正如他们所说,魔鬼在细节中:)。 Viewable 并不总是 UIView(或其子类)...它也可能是 AsyncDisplayKit 中的 ASDisplayNode。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2019-07-21
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多