我陷入困境,重构一切都为时已晚。由于这里解释的原因太长(但它们是有效的并且代码库工作正常),我不得不在其中一个方法中抽象出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'
答案 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
,因此扩展名不会出错。