Ios 如何在两个不同的定位点组合两个旋转以变换UIView
我想先围绕UIView的左边缘旋转,然后围绕UIView的右边缘旋转。第一次旋转应产生开门效果,完成后应开始第二次旋转。当第二次旋转完成时,效果应与视图在z平面中被向下推的效果相同。转换是手动动画的一部分,当然应该是无缝的 凭直觉,我想这是不可能使用锚点和连接2旋转发生在不同的锚点,但如果我错了,请纠正我。因此,我没有使用锚点,而是使用矩阵组合来产生旋转的效果 第一个旋转非常简单,但我不知道如何附加第二个旋转。也许在应用第二次旋转之前,我应该在y坐标上向右平移,在z坐标上向下平移,使用类似于cos90-angle*view.width的东西,以在第一次旋转结束时到达右边缘的位置。然而,我的尝试并没有成功。有什么想法吗? 以下是我到目前为止第一轮的情况:Ios 如何在两个不同的定位点组合两个旋转以变换UIView,ios,iphone,cocoa-touch,rotation,transformation,Ios,Iphone,Cocoa Touch,Rotation,Transformation,我想先围绕UIView的左边缘旋转,然后围绕UIView的右边缘旋转。第一次旋转应产生开门效果,完成后应开始第二次旋转。当第二次旋转完成时,效果应与视图在z平面中被向下推的效果相同。转换是手动动画的一部分,当然应该是无缝的 凭直觉,我想这是不可能使用锚点和连接2旋转发生在不同的锚点,但如果我错了,请纠正我。因此,我没有使用锚点,而是使用矩阵组合来产生旋转的效果 第一个旋转非常简单,但我不知道如何附加第二个旋转。也许在应用第二次旋转之前,我应该在y坐标上向右平移,在z坐标上向下平移,使用类似于co
-(void) transform:(float) percentage{
CATransform3D transform = CATransform3DIdentity;
//here I get the angle for the 1st rotation (percentage 0 -> angle 0; percentage 0.5 -> angle 45°
float angle = [self getFirstRotationAngle: percentage];
CATransform3D translateToRotateAt = CATransform3DMakeTranslation(myView.frame.size.width / 2.0, 0.0, 0.0);
CATransform3D rotation1 = CATransform3DIdentity;
rotation1.m34 = 1.0 / -500;
rotation1 = CATransform3DRotate(rotation1, angle, 0.0f, 1.0f, 0.0f);
CATransform3D translateBackToRotateAt = CATransform3DMakeTranslation(-myView.frame.size.width / 2.0, 0.0, 0.0f);
transform = CATransform3DConcat(translateToRotateAt, rotation1);
transform = CATransform3DConcat(transform , translateBackToRotateAt);
if (percentage > 0.5){
angle = [self getSecondRotationAngle: percentage];
// here I should get the second part of the transformation and concatenate it to the first part
}
myView.layer.transform = transform;
}
此方法可以为您生成一个变换,该变换使用您的度赋予其
func makeTransform(horizontalDegree: CGFloat, verticalDegree: CGFloat, maxVertical: CGFloat,rotateDegree: CGFloat, maxHorizontal: CGFloat) -> CATransform3D {
var transform = CATransform3DIdentity
transform.m34 = 1 / -500
let xAnchor = (horizontalDegree / (2 * maxHorizontal)) + 0.5
let yAnchor = (verticalDegree / (-2 * maxVertical)) + 0.5
let anchor = CGPoint(x: xAnchor, y: yAnchor)
setAnchorPoint(anchorPoint: anchor, forView: self.imgView)
let hDegree = (CGFloat(horizontalDegree) * .pi) / 180
let vDegree = (CGFloat(verticalDegree) * .pi) / 180
let rDegree = (CGFloat(rotateDegree) * .pi) / 180
transform = CATransform3DRotate(transform, vDegree , 1, 0, 0)
transform = CATransform3DRotate(transform, hDegree , 0, 1, 0)
transform = CATransform3DRotate(transform, rDegree , 0, 0, 1)
return transform
}
func setAnchorPoint(anchorPoint: CGPoint, forView view: UIView) {
var newPoint = CGPoint(x: view.bounds.size.width * anchorPoint.x, y: view.bounds.size.height * anchorPoint.y)
var oldPoint = CGPoint(x: view.bounds.size.width * view.layer.anchorPoint.x, y: view.bounds.size.height * view.layer.anchorPoint.y)
newPoint = newPoint.applying(view.transform)
oldPoint = oldPoint.applying(view.transform)
var position = view.layer.position
position.x -= oldPoint.x
position.x += newPoint.x
position.y -= oldPoint.y
position.y += newPoint.y
print("Anchor: \(anchorPoint)")
view.layer.position = position
view.layer.anchorPoint = anchorPoint
}