Перспектива и перелистывание UIImageView в то же время - PullRequest
1 голос
/ 01 июля 2011

Я пытаюсь перевернуть и дать перспективу повернуть вид изображения, чтобы получить такой эффект, как отражение.сначала я даю перспективу, используя 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 Ответ

2 голосов
/ 05 января 2012

Мне удалось достичь этого эффекта за 4 (необязательно 5) шага:

  1. Создайте два UIImageViews в своем кончике.Создайте 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;
    

Это выглядит так: enter image description here

...