2017-10-09 13 views
0

enter image description here現在CGAffineTransformationを有するのUIViewのIは、エッジのX位置(左上、右上、左下及び右下)を算出するエッジ

ための形質転換にXを取得しますrotationAngleでアクティブです。画像では、右端の赤い円のx位置を計算します。

この記事ではObj-cでそれを行う方法を説明します。私は信じています:http://www.informit.com/articles/article.aspx?p=1951182。私はそれを迅速に4に変換しようとしたが、私は多くの変更を加えなければならなかった。私はこれに来た:

func offsetPoint(toParentCoordinates aPoint: CGPoint) -> CGPoint { 
    return CGPoint(x: aPoint.x + self.cardView.center.x, y: aPoint.y + self.cardView.center.y) 
} 

func point(inViewCenterTerms aPoint: CGPoint) -> CGPoint { 
    return CGPoint(x: aPoint.x - self.cardView.center.x, y: aPoint.y - self.cardView.center.y) 
} 

func point(inTransformedView aPoint: CGPoint, someTransformation: CGAffineTransform) -> CGPoint { 
    let offsetItem: CGPoint = point(inViewCenterTerms: aPoint) 
    let updatedItem: CGPoint = offsetItem.applying(someTransformation) 
    let finalItem: CGPoint = offsetPoint(toParentCoordinates: updatedItem) 
    return finalItem 
} 

func originalFrame(someView: UIView, someTransformation: inout CGAffineTransform) -> CGRect { 
    let currentTransform: CGAffineTransform = someTransformation 
    someTransformation = CGAffineTransform.identity 
    let originalFrame: CGRect = someView.frame 
    someTransformation = currentTransform 
    return originalFrame 
} 

しかし、私は残りのところで立ち往生した。私は、スウィフト4で何か簡単になったのか、それとも残りのコードを引き続き動作させるのかを考えていました。今、あなたを

extension UIView { 

    /// Returns the frame without any transformations 
    var originalFrame: CGRect { 

     let currentTransform = self.transform 
     self.transform = CGAffineTransform.identity 
     let frame = self.frame 
     self.transform = currentTransform 

     return frame 
    } 

    /// Returns the offset of the given point from the view center 
    func centerOffset(from point: CGPoint) -> CGPoint { 
     return CGPoint(x: point.x - center.x, y: point.y - center.y) 
    } 

    /// Returns the point relative to the view center by the given offset 
    func pointRelativeToCenter(by offset: CGPoint) -> CGPoint { 
     return CGPoint(x: offset.x + center.x, y: offset.y + center.y) 
    } 

    /// Returns the given point in transformed coordinates 
    func newPointInView(point: CGPoint) -> CGPoint { 

     let offset = self.centerOffset(from: point) 
     let transformedOffset = offset.applying(self.transform) 

     return self.pointRelativeToCenter(by: transformedOffset) 
    } 

    // Helpers to get the new View corner coordinates 

    var newTopLeft: CGPoint { 
     let frame = self.originalFrame 
     return self.newPointInView(point: frame.origin) 
    } 

    var newTopRight: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.x += frame.size.width 
     return self.newPointInView(point: point) 
    } 

    var newBottomLeft: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.y += frame.size.height 
     return self.newPointInView(point: point) 
    } 

    var newBottomRight: CGPoint { 
     let frame = self.originalFrame 
     var point = frame.origin 
     point.x += frame.size.width 
     point.y += frame.size.height 
     return self.newPointInView(point: point) 
    } 
} 

:私はあなたがあなたの質問ににリンクされてきたエリカSadunによるOBJの-Cコードに基づいて、このUIView拡張を書いたので、私も自分のプロジェクトの一つのために、この機能を必要と

+0

座標には簡単な計算を使ってみましたか?let x = r * sin(angle)y = r * cos(angle)? rは半径で、あなたの場合は対角線の半分の長さです。 – Woof

答えて

1

親空間内の変換されたビューのそれぞれのコーナー位置を得るために、のいずれかのに適用されたnewTopLeftnewTopRightnewBottomLeftおよびnewBottomRightプロパティにアクセスすることができます。

ここでは、拡張機能を使用する方法を実証するために少し遊び場の例です:

import UIKit 
import PlaygroundSupport 

// Setting up some example views 
let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500)) 
containerView.backgroundColor = .white 
PlaygroundPage.current.liveView = containerView 

let transformedView = UIView(frame: CGRect(x: 150, y: 150, width: 200, height: 200)) 
transformedView.backgroundColor = .clear 
transformedView.layer.borderWidth = 3 
transformedView.layer.cornerRadius = 2 
containerView.addSubview(transformedView) 

// Add a rotation 
let angle = CGFloat.pi/4 
transformedView.transform = CGAffineTransform(rotationAngle: -angle) 

print(transformedView.newTopLeft) // assuming you've inserted the extension into the Playground somewhere above this line 

enter image description here

print(transformedView.newTopLeft)は、出力

(108.57864376269, 250.0) 

は、あなたがチェックするためにいくつかの簡単な三角法を使用することができます値が正しいことを確認します。

+0

Thx bro。私はこの行に問題がありました:PlaygroundPage.current.liveView = containerView、私はVCでそれをテストしました。出来た :)。制限のために私は賞金を数時間で授与することができます。 – NoKey

+0

@JasperVisserああ、そうです!ライブビューを動作させるには 'PlaygroundSupportをインポートする '必要があります。私はその行をコピーすることを忘れていた。 – Keiwan

関連する問題