現在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
拡張を書いたので、私も自分のプロジェクトの一つのために、この機能を必要と
座標には簡単な計算を使ってみましたか?let x = r * sin(angle)y = r * cos(angle)? rは半径で、あなたの場合は対角線の半分の長さです。 – Woof