【发布时间】: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?
【问题讨论】: