透视和同时翻转UIImageView

时间:2011-07-01 14:53:41

标签: iphone objective-c uiimageview rotation perspective

我试图翻转并给透视旋转一个uiimageview,以获得像反射一样的效果。首先,我使用CATransform3D提供透视,然后使用CGAffineTransformMake进行翻转。然而,在第二次转变之后我放松了透视效果。我无法弄清楚如何使用CATransform3D进行透视和翻转。 img是第一个图像,img2将是它的反映。

CALayer *layer = img.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -600;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 30.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;
img2.transform = CGAffineTransformMake(
                                            1, 0, 0, -1, 0, img2.bounds.size.height
                                            );

1 个答案:

答案 0 :(得分:2)

我能够在4个(可选5个)步骤中完成此效果:

  1. 在笔尖中创建两个UIImageViews。为主图像创建UIImageView,然后为您的反射图像创建另一个UIImageView。确保其视图内容模式均设置为Aspect Fit。此外,将反射图像的帧大小设置为主图像的帧大小(因为透视反射将为图像增加宽度)。
  2. 正常加载主图像。现在加载反射是颠倒的:

    reflectionView.image = [UIImage
                       imageWithCGImage:mainImageView.image.CGImage
                       scale:1.0f
                       orientation: UIImageOrientationDownMirrored];
    
  3. 现在创建透视变换,如下所示:

    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform.m24 = 1.0f/-mainImageView.frame.size.width;
    [[reflectionView layer] setTransform:rotationAndPerspectiveTransform];
    
  4. 最后,将反射移动到位:

    reflectionView.center = CGPointMake(self.view.frame.size.width/2, mainImageView.frame.size.height*1.5);
    
  5. 可选地,添加渐变以使反射逐渐消失 背景:

    reflectionView.layer.masksToBounds = YES;
    
    // define gradient
    CAGradientLayer *theGradient = [CAGradientLayer layer];
    theGradient.frame = reflectionView;
    theGradient.colors = [NSArray arrayWithObjects:
                          (id)[[UIColor clearColor] CGColor],
                          (id)[[UIColor blackColor] CGColor], nil];
    
    // add gradient to reflection image
    [reflectionView insertSublayer:theGradient atIndex:0];
    reflectionView = 0.25f;
    
  6. 看起来像这样: enter image description here