我正在尝试找到旋转的矩形UIView的四个角的坐标。
我认为我能做的一种方法是使用识别器。旋转,找到旋转角度然后计算原点。但这需要进行几何计算。
- (IBAction)handlePan:(UIRotationGestureRecognizer*)recognizer {
NSLog(@"Rotation in degrees since last change: %f", [recognizer rotation] * (180 / M_PI));
recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
NSLog(@"%@",recognizer);
recognizer.rotation = 0;
NSLog(@"bound is %f and %f, frame is %f and %f, %f and %f.",recognizer.view.bounds.size.width,recognizer.view.bounds.size.height, recognizer.view.frame.size.width,recognizer.view.frame.size.height, recognizer.view.frame.origin.x, recognizer.view.frame.origin.y);
}
我只是想知道是否还有其他更方便的方法来获取坐标? 谢谢!
编辑:
看起来我们在这里有一个很好的答案(见下面的答案)。我设法通过一种愚蠢的方式计算角落 - 使用旋转角度和几何。它有效,但不容易和轻松。我在这里分享我的代码以防万一有人可能想要使用它(即使我怀疑它。)
float r = 100;
NSLog(@"radius is %f.",r);
float AAngle = M_PI/3+self.rotatedAngle;
float AY = recognizer.view.center.y - sin(AAngle)*r;
float AX = recognizer.view.center.x - cos(AAngle)*r;
self.pointPADA = CGPointMake(AX, AY);
NSLog(@"View Center is (%f,%f)",recognizer.view.center.x,recognizer.view.center.y);
NSLog(@"Point A has coordinate (%f,%f)",self.pointPADA.x,self.pointPADA.y);
float BAngle = M_PI/3-self.rotatedAngle;
float BY = recognizer.view.center.y - sin(BAngle)*r;
float BX = recognizer.view.center.x + cos(BAngle)*r;
self.pointPADB = CGPointMake(BX, BY);
NSLog(@"Point B has coordinate (%f,%f)",BX,BY);
float CY = recognizer.view.center.y + sin(AAngle)*r;
float CX = recognizer.view.center.x + cos(AAngle)*r;
self.pointPADC = CGPointMake(CX, CY);
NSLog(@"Point C has coordinate (%f,%f)",CX,CY);
float DY = recognizer.view.center.y + sin(BAngle)*r;
float DX = recognizer.view.center.x - cos(BAngle)*r;
self.pointPADD = CGPointMake(DX, DY);
NSLog(@"Point D has coordinate (%f,%f)",DX,DY);
答案 0 :(得分:7)
这是我的解决方案,但我想知道是否有更简洁的方式:
CGPoint originalCenter = CGPointApplyAffineTransform(theView.center,
CGAffineTransformInvert(theView.transform));
CGPoint topLeft = originalCenter;
topLeft.x -= theView.bounds.size.width / 2;
topLeft.y -= theView.bounds.size.height / 2;
topLeft = CGPointApplyAffineTransform(topLeft, theView.transform);
CGPoint topRight = originalCenter;
topRight.x += theView.bounds.size.width / 2;
topRight.y -= theView.bounds.size.height / 2;
topRight = CGPointApplyAffineTransform(topRight, theView.transform);
CGPoint bottomLeft = originalCenter;
bottomLeft.x -= theView.bounds.size.width / 2;
bottomLeft.y += theView.bounds.size.height / 2;
bottomLeft = CGPointApplyAffineTransform(bottomLeft, theView.transform);
CGPoint bottomRight = originalCenter;
bottomRight.x += theView.bounds.size.width / 2;
bottomRight.y += theView.bounds.size.height / 2;
bottomRight = CGPointApplyAffineTransform(bottomRight, theView.transform);
答案 1 :(得分:0)
在Swift 3.1中检查了答案
struct ViewCorners {
private var _topLeft: CGPoint!
private var _topRight: CGPoint!
private var _bottomLeft: CGPoint!
private var _bottomRight: CGPoint!
var topLeft: CGPoint { return _topLeft }
var topRight: CGPoint { return _topRight }
var bottomLeft: CGPoint { return _bottomLeft }
var bottomRight: CGPoint { return _bottomRight }
private let originalCenter: CGPoint
private let transformedView: UIView
private func pointWith(multipliedWidth: CGFloat, multipliedHeight: CGFloat) -> CGPoint {
var x = originalCenter.x
x += transformedView.bounds.width / 2 * multipliedWidth
var y = originalCenter.y
y += transformedView.bounds.height / 2 * multipliedHeight
var result = CGPoint(x: x, y: y).applying(transformedView.transform)
result.x += transformedView.transform.tx
result.y += transformedView.transform.ty
return result
}
init(view: UIView) {
transformedView = view
originalCenter = view.center.applying(view.transform.inverted())
_topLeft = pointWith(multipliedWidth:-1, multipliedHeight:-1)
_topRight = pointWith(multipliedWidth: 1, multipliedHeight:-1)
_bottomLeft = pointWith(multipliedWidth:-1, multipliedHeight: 1)
_bottomRight = pointWith(multipliedWidth: 1, multipliedHeight: 1)
}
}
答案 2 :(得分:0)
使用Swift 4,我们可以通过简单的方法获得旋转视图的边界。
let transformdBounds = view.bounds.applying(view.transform)