Анимация, как при удалении из фотогалереи iPhone

Пытаюсь реализовать анимацию: когда заходишь в iPhone Gallery, нажимаешь изображение, видишь полноэкранное изображение. Ниже вы можете увидеть панель инструментов с кнопкой корзины. При нажатии этой кнопки изображение удаляется с анимацией. Я пытаюсь реализовать это, но не знаю, как реализовать преобразование изображения, использование яблока. Это лучшее, что я мог:

[UIView transitionWithView:self.view duration:0.1 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.view addSubview:scrollImageView];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
            CGRect frame = scrollImageView.frame;
            frame.size = CGSizeMake(frame.size.width * 0.75, frame.size.height * 0.75);
            frame.origin = CGPointMake((size.width - frame.size.width) / 2, (size.height - frame.size.height) / 2);
            scrollImageView.frame = frame;
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionAllowUserInteraction animations:^{
                CGRect frame = scrollImageView.frame;
                frame.size = CGSizeMake(frame.size.width * 0.05, frame.size.height * 0.05);
                frame.origin = CGPointMake(size.width, size.height);
                scrollImageView.frame = frame;
                CGAffineTransform transform = scrollImageView.transform;
                CGAffineTransform rotatedTransform = CGAffineTransformRotate(transform, 45 * 3.14 / 180);
                scrollImageView.transform = rotatedTransform;
            } completion:^(BOOL finished) {
                [scrollImageView removeFromSuperview];
            }];
        }];
    }];

Заранее спасибо.

Обновление Насколько я понимаю, я не могу сделать эту анимацию с помощью Core-Animation, но может ли кто-нибудь посоветовать мне анимацию, наиболее похожую на анимацию галереи iPhone, но без использования OpenGL?


person Paul T.    schedule 21.06.2012    source источник


Ответы (4)


На данный момент точная анимация, о которой вы говорите, не может быть выполнена с помощью Core Animation или UIKit. Вам нужно будет использовать OpenGL и применить изображение как текстуру и сделать там свою анимацию.

person David Rönnqvist    schedule 21.06.2012
comment
Можете ли вы посоветовать мне анимацию, наиболее похожую на анимацию из галереи iPhone, но без использования OpenGL? - person Paul T.; 21.06.2012
comment
Ранее я писал сообщение в блоге, пытаясь воспроизвести Open in фоновая анимация из Safari. Он очень похож, но в то же время очень отличается. Вероятно, вы могли бы чему-то научиться и адаптировать нужные вам части для своей анимации. - person David Rönnqvist; 21.06.2012

Вы можете использовать следующий пример для этой анимации:

UIView *senderView = (UIView*)sender;

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
            anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
            anim.duration = 0.125;
            anim.repeatCount = 1;
            anim.autoreverses = YES;
            anim.removedOnCompletion = YES;
            anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)];
            //[senderView.layer addAnimation:anim forKey:nil];


UIBezierPath *movePath = [UIBezierPath bezierPath];
            [movePath moveToPoint:icon.center];
            [movePath addQuadCurveToPoint:senderView.center
                             controlPoint:CGPointMake(senderView.center.x, icon.center.y)];

            CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
            moveAnim.path = movePath.CGPath;
            moveAnim.removedOnCompletion = YES;

            CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
            scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
            scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
            scaleAnim.removedOnCompletion = YES;

            CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
            opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
            opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
            opacityAnim.removedOnCompletion = YES;

            CAAnimationGroup *animGroup = [CAAnimationGroup animation];
            animGroup.animations = [NSArray arrayWithObjects:moveAnim, scaleAnim, opacityAnim, nil];
            animGroup.duration = 0.5;
            [icon.layer addAnimation:animGroup forKey:nil];

Я изменил код, вы должны внести в него следующие изменения, установить представление отправителя как self.view и изменить конечную точку анимации (которая в настоящее время является senderView.center) в соответствии с вашими требованиями.

person Rajkumar    schedule 21.06.2012
comment
Пожалуйста, не могли бы вы изменить свой пример, используя мои scrollImageView и self.view. Поскольку я пытался использовать scrollImageView вместо значка, а анимация ужасная, я думаю, что я чего-то не понимаю. - person Paul T.; 25.06.2012
comment
@Paul Galavic - Сделали этот тип анимации? Мне любопытно узнать, я тоже хочу его реализовать. - person TheFlash; 30.04.2013

Я знаю, что это немного поздно. Но вам следует проверить решение Ciechan под названием BCGenieEffect. Можно найти здесь. Это чистая основная анимация, и ее очень легко понять. Я думаю, это то, что вы ищете.

Удачи

person fyasar    schedule 28.03.2013

Я думаю, вы говорите про "отстойную" анимацию перехода.

Его можно запустить, но это частный переход, и Apple может отклонить ваше приложение, если вы его используете.

Этот код должен сделать это, используя код перехода 103:

[UIView beginAnimations: nil context: NULL]; [UIView setAnimationDuration: 1.0]; [UIView setAnimationTransition: transtionIndex forView: containerView cache: NO]; [containerView addSubview: newView]; [oldView removeFromSuperview]; [UIView commitAnimations];

Или поищите в сети переход Core Image под названием "suckEffect"

person Duncan C    schedule 22.06.2012