是否有另一种方法来转换rects的坐标?

时间:2016-09-13 10:01:12

标签: ios swift uiview

我陷入困境,重构一切都为时已晚。由于这里解释的原因太长(但它们是有效的并且代码库工作正常),我不得不在其中一个方法中抽象出UIImageViews作为返回类型,而我只返回一个procotol。 这个名为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,相反它只是一个纯数学公式,只处理CGRect s& CGPoint S'

1 个答案:

答案 0 :(得分:0)

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

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 {

只会在符合要求的类型为UIView

时添加功能

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