iPhone - Анимация 2 субвью одновременно - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть 2 подпредставления, которые занимают весь экран (за исключением строки состояния). Давайте назовем этот размер «размером экрана».

Я хочу анимировать оба:

  • первый, который увеличил изображение немного больше, чем размер экрана, до размера экрана, от альфа 0 до альфа 1.

  • Секунда от размера экрана до чуть меньше размера экрана, от альфа 1 до альфа 0.

Второй вид виден и на экране при запуске.

Я написал это:

- (void) switchViews
{
    if (self.view2Controller == nil) {
        self.view2Controller = [[View2Controller alloc] initWithNibName:@"View2XIB" bundle:nil];
        self.view2Controller.view.hidden = YES;
        [self.view addSubview:self.view2Controller.view];
    }

    CGRect bigFrame = CGRectInset(self.view.frame, -50, -50);
    CGRect normalFrame = self.view.frame;
    CGRect smallFrame = CGRectInset(self.view.frame, 50, 50);

    self.view2Controller.view.frame = bigFrame;
    self.view2Controller.view.alpha = 0.0;

    [UIView beginAnimations:@"Anim1" context:nil];
    [UIView setAnimationDuration:5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.view2Controller.view.hidden = NO;
    self.view2Controller.view.frame = normalFrame;
    self.view2Controller.view.alpha = 1.0;

    [UIView commitAnimations];

    // ------------------------------

    [UIView beginAnimations:@"Anim2" context:nil];
    [UIView setAnimationDuration:5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:self.view cache:YES];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    self.view1Controller.view.frame = smallFrame;
    self.view1Controller.view.alpha = 0.0;

    [UIView commitAnimations];
}

Конечно, я сначала попытался сделать обе анимации уникальными. Это ничего не меняет, поэтому я попытался отделить их.

При запуске view1 сразу становится черным, затем view2 начинает анимацию, как и ожидалось. Но я не могу запустить обе анимации одновременно.

Как бы я это сделал?

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Попробуйте взглянуть на блочную анимацию.Это рекомендуемый метод iOS 4.0+.Посмотрите на ответ здесь: Что такое блочные методы анимации в iPhone OS 4.0?

РЕДАКТИРОВАТЬ Попробуйте что-то вроде этого

//You can do the same thing with a frame
CGPoint newCenter = CGPointMake(100, 100);
[UIView animateWithDuration:2.0
                 animations:^{ 
                     firstView.center = newCenter;
                     secondView.center = newCenter;
                     firstView.alpha = 0.2;
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"All done animating");
                 }];

Все, что вы помещаете в анимацию: ^ {} будет настройками назначения вашего вида.Выше я показал вам, как изменить положение, а также альфа.

0 голосов
/ 30 сентября 2011

Я не вижу ничего плохого в вашем коде. поэтому я попробовал ваш код в моем проекте, и он работает хорошо: он делает именно то, что вы хотели.

Вид1 перемещается вниз-вправо и постепенно исчезает, тогда как вид2 появляется сверху слева и постепенно исчезает ...

так что я думаю, вы должны искать ошибку где-то еще ...

чао,

Luca

EDIT:

вот код:

test-switch.zip

0 голосов
/ 30 сентября 2011

Я думаю, что вы хотите использовать CAAnimationGroup (Core Animation Group).

CAAnimationGroup позволяет группировать и запускать несколько анимаций одновременно. Сгруппированные анимации выполняются во временном пространстве, указанном экземпляром CAAnimationGroup.

У него есть свойство animations, которое вы задаете как массив анимаций, которые вы хотите сделать с setAnimations:.

Вот пример использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...