Переключение представлений с использованием основной анимации не работает?

#iphone #ios #core-animation

#iPhone #iOS #ядро-анимация

Вопрос:

В настоящее время у меня возникла проблема с переключением представлений с использованием основной анимации. Я хочу перейти к следующему просмотру. Прямо сейчас он ничего не делает, кроме потери событий касания из моего исходного представления. Что я делаю не так в приведенном ниже коде?

Редактировать код1:

     - (void)changeView1ToView2 {
    CABasicAnimation *fadeout= [CABasicAnimation animationWithKeyPath:@"opacity"];
    [fadeout setDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:)];
    [fadeout setToValue:[NSNumber numberWithFloat:0]];
    [fadeout setDuration:0.5];
    [[self.view layer] addAnimation:fadeout forKey:@"alpha"];
}
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
    [self.view addSubview:self.view2.view];
    self.view2.view.frame = [UIScreen mainScreen].bounds;
    [self.view2.view setAlpha:0];
    CABasicAnimation *fadein = [CABasicAnimation animationWithKeyPath:@"opacity"];
    [fadein setToValue:[NSNumber numberWithFloat:1.0]];
    [fadein setDuration:0.5];
    [[self.view2.view layer] addAnimation:fadein forKey:@"alpha"];
}
  

Хорошо, я добавил self, посмотрите на мой новый код выше. view2 — это UIViewController, вот почему я делаю .view после него. Приложение будет доступно только на iOS 5 или выше, так что это не проблема. Но то, чего я пытаюсь добиться, — это переключение представлений с использованием основной анимации, и каждый UIViewController управляет своими собственными представлениями. Я просто переключаю представления, используя основную анимацию вместо обычных средств.

Комментарии:

1. view2 self В данном случае является членом? Должно ли это быть свойством, аля self.view2 …? Вероятно, это не связано с вашей проблемой, но если у вас есть свойство для этого участника, вы должны использовать средства доступа везде, где это возможно. - (void) dealloc и любые init методы являются исключением.

2. Кроме того, я предполагаю, что view2 это на самом деле UIViewController подкласс? Похоже, это основано на синтаксисе. Если вы ориентируетесь на iOS4 или более раннюю версию, не рекомендуется использовать несколько контроллеров просмотра, использующих один и тот же UIView . В iOS5 у вас может быть несколько контроллеров представления, совместно использующих части иерархии представлений, но вы должны использовать методы контейнера view controller self для их добавления, предполагая self , что это также a UIViewController .

3. Понял — спасибо, это намного понятнее. Я добавил ответ ниже, который может помочь. Дайте мне знать, если мне нужно уточнить!

Ответ №1:

Если вы хотите одновременно иметь только один корневой вид на экране (и, судя по этому вызову [UIScreen mainScreen].bounds , вы есть), тогда я бы предложил поменять местами представления на UIWindow уровне. Без анимации это выглядело бы примерно так:

 // Assuming UIViewControllers called view1 and view2 as members of some
// (non-UIViewController) controller class (self, in this case)
//and that view1.view is in the application's window's subviews collection
[self.view1.view removeFromSuperview];
[[UIApplication sharedApplication].delegate.window addSubview:self.view2.view];
  

Чтобы не видеть, как представления фактически меняются местами, вам необходимо убедиться, что ваша анимация сохраняет изменения, внесенные вами во время анимации. В частности, вам необходимо установить следующее:

 myAnimation.fillMode = kCAFillModeForwards;
myAnimation.removedOnCompletion = NO;
  

Затем ваши методы могут быть скорректированы с учетом всего этого. Например, ваш animationDidStop:finished: метод может выглядеть так:

 - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
{
    [self.view1.view removeFromSuperview];

    [self.view2.view setAlpha:0];
    [[UIApplication sharedApplication].delegate.window addSubview:self.view2.view];

    CABasicAnimation *fadein = [CABasicAnimation animationWithKeyPath:@"opacity"];
    [fadein setToValue:[NSNumber numberWithFloat:1.0]];
    [fadein setDuration:0.5];
    fadein.fillMode = kCAFillModeForwards;
    fadein.removedOnCompletion = NO;
    [[self.view2.view layer] addAnimation:fadein forKey:@"alpha"];
}
  

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

Комментарии:

1. Я действительно не хочу переключать представления на уровне UIWindow. Я хочу сохранить его на нормальном уровне. Также я хочу отключить view1, ЗАТЕМ изменить views на view, чтобы затем изменить его с альфа-значения 0.