Ios 如何在两个不同的定位点组合两个旋转以变换UIView

Ios 如何在两个不同的定位点组合两个旋转以变换UIView,ios,iphone,cocoa-touch,rotation,transformation,Ios,Iphone,Cocoa Touch,Rotation,Transformation,我想先围绕UIView的左边缘旋转,然后围绕UIView的右边缘旋转。第一次旋转应产生开门效果,完成后应开始第二次旋转。当第二次旋转完成时,效果应与视图在z平面中被向下推的效果相同。转换是手动动画的一部分,当然应该是无缝的 凭直觉,我想这是不可能使用锚点和连接2旋转发生在不同的锚点,但如果我错了,请纠正我。因此,我没有使用锚点,而是使用矩阵组合来产生旋转的效果 第一个旋转非常简单,但我不知道如何附加第二个旋转。也许在应用第二次旋转之前,我应该在y坐标上向右平移,在z坐标上向下平移,使用类似于co

我想先围绕UIView的左边缘旋转,然后围绕UIView的右边缘旋转。第一次旋转应产生开门效果,完成后应开始第二次旋转。当第二次旋转完成时,效果应与视图在z平面中被向下推的效果相同。转换是手动动画的一部分,当然应该是无缝的

凭直觉,我想这是不可能使用锚点和连接2旋转发生在不同的锚点,但如果我错了,请纠正我。因此,我没有使用锚点,而是使用矩阵组合来产生旋转的效果

第一个旋转非常简单,但我不知道如何附加第二个旋转。也许在应用第二次旋转之前,我应该在y坐标上向右平移,在z坐标上向下平移,使用类似于cos90-angle*view.width的东西,以在第一次旋转结束时到达右边缘的位置。然而,我的尝试并没有成功。有什么想法吗? 以下是我到目前为止第一轮的情况:

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