2013-07-19 7 views
6

Я хочу, чтобы достичь чего-то вроде этого:Perspective проблема в 3D Rotation

enter image description here

Какой снимок моей точки зрения контроллера

Код Я попытался, как это:

UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 

    // Take a snapshot 
    // 
    _screenshotView = [[UIImageView alloc] initWithFrame:CGRectNull]; 

    _screenshotView.image = [self getScreenSnapshot]; 

    _screenshotView.frame = CGRectMake(-160, -284, _screenshotView.image.size.width, _screenshotView.image.size.height); 
    _screenshotView.userInteractionEnabled = YES; 
    _screenshotView.layer.anchorPoint = CGPointMake(0, 0); 

    _originalSize = _screenshotView.frame.size; 

    [window addSubview:_screenshotView]; 

    [self minimizeFromRect:CGRectMake(0, 0, _originalSize.width, _originalSize.height)]; 


- (void)minimizeFromRect:(CGRect)rect 
{ 
    UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
    CGFloat m = 0.7; 
    CGFloat newWidth = _originalSize.width * m; 
    CGFloat newHeight = _originalSize.height * m; 

    [CATransaction begin]; 
    [CATransaction setValue:[NSNumber numberWithFloat:0.6] forKey:kCATransactionAnimationDuration]; 
    [self addAnimation:@"position.x" view:_screenshotView startValue:rect.origin.x endValue:window.frame.size.width - 80.0]; 
    [self addAnimation:@"position.y" view:_screenshotView startValue:rect.origin.y endValue:(window.frame.size.height - newHeight)/2.0]; 
    [self addAnimation:@"bounds.size.width" view:_screenshotView startValue:rect.size.width endValue:newWidth]; 
    [self addAnimation:@"bounds.size.height" view:_screenshotView startValue:rect.size.height endValue:newHeight]; 

    _screenshotView.layer.position = CGPointMake(window.frame.size.width - 80.0, (window.frame.size.height - newHeight)/2.0); 
    _screenshotView.layer.bounds = CGRectMake(window.frame.size.width - 80.0, (window.frame.size.height - newHeight)/2.0, newWidth, newHeight); 

    CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity; 
    rotationAndPerspectiveTransform.m34 = 1.0/-600; 
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -20.0f * M_PI/180.0f, 0.0f, 1.0f, 0.0f); 
    _screenshotView.layer.transform = rotationAndPerspectiveTransform; 

    [CATransaction commit]; 
} 

Код работает отлично, за исключением того, что похоже, что поворот показан с другой точки зрения, потому что моментальный снимок после анимации оказывается таким, как это :

enter image description here

Что мне не хватает?

ответ

0

Решено путем замены UIImageView Объект с CALayer Объект слоя изображения. Благодаря https://github.com/kristopherjohnson/perspectivetest

UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 

    // Take a snapshot 
    // 

    UIImage *image = [self getScreenSnapshot]; 
    CGImageRef pictureImage = image.CGImage; 

    CGFloat zDistance = 1200.0f; 
    CATransform3D transform = CATransform3DIdentity; 
    transform.m34 = 1.0f/-zDistance; 

    _screenshotView = [[UIView alloc] initWithFrame:CGRectNull]; 
    _screenshotView.frame = CGRectMake(0, 0, image.size.width, image.size.height); 
    _screenshotView.userInteractionEnabled = YES; 

    _imageLayer = [CALayer layer]; 
    _imageLayer.frame = _screenshotView.frame;; 
    _imageLayer.contents = (__bridge id)pictureImage; 
    _imageLayer.transform = transform; 

    [_screenshotView.layer addSublayer:_imageLayer]; 

    _originalSize = _screenshotView.frame.size; 

    [window addSubview:_screenshotView]; 

    [self minimizeFromRect:CGRectMake(0, 0, _originalSize.width, _originalSize.height)]; 


- (void)minimizeFromRect:(CGRect)rect 
{ 
    UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
    CGFloat m = 0.6; 
    CGFloat newWidth = _originalSize.width * m; 
    CGFloat newHeight = _originalSize.height * m; 

    [CATransaction begin]; 
    [CATransaction setValue:[NSNumber numberWithFloat:0.4] forKey:kCATransactionAnimationDuration]; 
    [self addAnimation:@"position.x" view:_screenshotView startValue:rect.origin.x endValue:window.frame.size.width - 40.0]; 
    [self addAnimation:@"position.y" view:_screenshotView startValue:rect.origin.y endValue:(window.frame.size.height - newHeight)/2.0]; 
    [self addAnimation:@"bounds.size.width" view:_screenshotView startValue:rect.size.width endValue:newWidth]; 
    [self addAnimation:@"bounds.size.height" view:_screenshotView startValue:rect.size.height endValue:newHeight]; 
    [self addAnimationForLayer:@"transform.rotation.y" view:_imageLayer startValue:0.0f endValue:-0.4 * M_PI]; 


    _screenshotView.layer.position = CGPointMake(window.frame.size.width - 80.0, (window.frame.size.height - newHeight)/2.0); 
    _screenshotView.layer.bounds = CGRectMake(window.frame.size.width - 80.0, (window.frame.size.height - newHeight)/2.0, newWidth, newHeight); 

    [CATransaction commit]; 
} 
0

Один из способов может быть, что вы можете использовать два изображения, одно для верхней части и один для нижней половины. И вы можете сшить два изображения вместе, чтобы промежуток не был виден, и вы можете получить желаемый результат.

Установите свойство на одно положительное и одно отрицательное значение для верхнего и нижнего изображений или наоборот. Вы можете получить два изображения желаемого результата. Затем вы можете установить рамку, чтобы они склеивались, чтобы они выглядели как одно изображение.

недвижимости :: rotationAndPerspectiveTransform.m34 = 1.0/600.0;

недвижимости :: rotationAndPerspectiveTransform.m34 = -1.0/600.0;

Вы, возможно, потребуется сделать некоторые удар и суда.

+0

Почему бы не сделать это правильно? – Firdous

+0

Чтобы сделать это сразу, вам нужно сделать поворот более чем на двух плоскостях. Для примера - In Y и Z. И вам нужно проверить и сделать это правильно, установив разные углы. То, что вы делаете, только от оси Y. – NiKKi

+0

не могу получить то, что вам нравится, но Ive уже решил его, применив анимацию непосредственно к объекту CALayer, см. Отмеченный ответ – Firdous