2016-09-13 1 views
0

私は罠に陥ってしまい、すべてをリファクタリングするのは遅すぎる。ここで説明するには時間がかかりすぎますが(有効ですが、コードベースはうまく動作します)、メソッドの1つとして戻り値としてUIImageViewsを抽象化し、代わりにプロコルを返します。 このプロトコルはViewableと呼ばれ、5つのプロパティしかありません。 rectの座標を変換する別の方法はありますか?

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の& CGPoint秒を扱う純粋数学の式のようになり、あるのでしょうか?

答えて

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) 
     } 
    } 

私はそれを自分でテストしたが、動作するはずですhaventは。何が起こるか教えてください。

extension Viewable where Self: UIView { 

準拠のタイプはUIViewの

である場合にのみ機能を追加します。その場合、convertRectが存在するため、拡張子に誤りはありません。

+0

悪魔は、彼らが言うように詳細にあります:)。 Viewableは常にUIView(またはそのサブクラス)ではなく、AsyncDisplayKitのASDisplayNodeでもかまいません。 –

関連する問題