UIView transitionWithView прикольные результаты - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь написать приложение, которое использует пользовательские анимации для перехода между контроллерами представления в стеке представления в UINavigationController.

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

Мои визуальные цели заключаются в следующем:1. Создайте новый «FirstVC».2. Установите значение альфа [FirstVC view] на 0.3. Установите значение преобразования [Вид FirstVC] на 25% в обоих направлениях (вертикальное и горизонтальное).В блоке анимации я хотел бы выполнить следующее:1. Установите значение преобразования [OutgoingVC view] на 500% в обоих направлениях (увеличивая его в 5 раз).2. Установите альфа-значение [OutgoingVC view] на 0 (постепенно исчезает).3. Установите значение преобразования [Вид FirstVC] на 1 (возвращая его к исходному размеру).4. Установите для альфа-значения [FirstVC view] значение 1 (переход в полноцветный режим).

Чистый эффект этой анимации должен состоять в том, что «верхняя страница» взрывается и затухает, а «следующая»/ нижняя страница "взрывается (только на весь экран) и исчезает. Идея состоит в том, чтобы пользователь провалился сквозь пол или что-то в этом роде.«Идем глубже.»

Я замедлил свою анимацию до интервала 10,0 секунд, чтобы я мог лучше понять, что происходит.

Похоже, что анимация происходит "Исходящие ВК "(т. Е. Вид сверху) верны.Вид снизу, однако, выглядит хорошо (100% размера экрана и альфа = 1,0), но затем он продолжает работать и, кажется, увеличивается до 4x / 5x, а также постепенно уменьшается до альфа 0. После того, какэкран стал полностью черным, новый UIViewController (FirstVC) правильно отображается на экране.

Кто-нибудь видит, почему мой код не работает так, как я хочу?

Спасибо!


Глупый я!Вот код:
- (IBAction)AddNewScreenPressed:(id)sender 
{
    FirstVC *newViewController = [[FirstVC alloc] init];
    UIView *currentView = [self view];
    UIView *newView = [newViewController view];
    [newView setTransform:CGAffineTransformMakeScale(0.25, 0.25)];
    [newView setAlpha:0];
    [UIView transitionWithView:[self view]
                      duration:10.0
                       options:UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        [[self view] addSubview:newView];
                        [currentView setAlpha:0];
                        [currentView setTransform:CGAffineTransformMakeScale(5.0, 5.0)];
                        [newView setAlpha:1.0];
                        [newView setTransform:CGAffineTransformMakeScale(1, 1)];
                    }
                    completion:^(BOOL finished){
                        [[self navigationController] pushViewController:newViewController animated:NO];
                    }
     ];
}

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Еще поиграв с ним, я преодолел один горб и столкнулся с другим препятствием.

Я одобряю ответ jrturton, потому что проблема действительно казалась связанной с тем, что я добавлялновое представление для [self view].

Что я сделал, чтобы обойти это, так это добавил представление буфера ([self BackView]), которое существует между [self view] и его подпредставлениями.

Затем, затем следующий код работает, чтобы выдвинуть новый контроллер представления:

- (IBAction)AddNewScreenPressed:(id)sender 
{
    FirstVC *newViewController = [[FirstVC alloc] init];
    UIView *newView = [newViewController view];
    [newView setAlpha:0];
    [newView setTransform:CGAffineTransformMakeScale(0.25, 0.25)];
    [[self view] addSubview:newView];
    [UIView transitionWithView:[self view]
                      duration:1.0 
                       options:UIViewAnimationOptionCurveEaseInOut
                    animations:^{
                        [[self BackView] setTransform:CGAffineTransformMakeScale(5, 5)];
                        [[self BackView] setAlpha:0];
                        [newView setTransform:CGAffineTransformMakeScale(1, 1)];
                        [newView setAlpha:1];
                    }
                    completion:^(BOOL finished){
                        [newView removeFromSuperview];
                        [[self navigationController] pushViewController:newViewController animated:NO];
                        [[self BackView] setTransform:CGAffineTransformIdentity];
                        [[self BackView] setAlpha:1];
                    }
     ];
}

Теперь, конечно, я столкнулся с другой проблемой, а именно, с подключением контроллеров.

Когда я их выдвигаю,анимация, кажется, работает просто отлично, но когда я добираюсь до конца (блок завершения) и делаю следующее:[[self navigationController] popViewControllerAnimated:NO];или даже:[[self navigationController] popViewControllerAnimatedYES];в итоге я получаю чистый белый экран.

Я предполагаю, что что-то, что я делаю во время моей "анимации толчка", вызывает эту проблему, но я не могу понять это!Помогите!

Спасибо!

1 голос
/ 08 августа 2011

Вы добавили newView в качестве подпредставления currentView, поэтому, возможно, анимации, которые вы делаете для currentView, также применимы к newView - он, вероятно, масштабируется и также меняет альфа своих подпредставлений, включая newView. Не могли бы вы иметь начальный масштаб newView равным 0,2 и отбросить масштабирование newView в блоке анимации, чтобы оно в конечном итоге оказалось в масштабе 1,0? Не уверен, что делать с альфой, хотя ...

РЕДАКТИРУЙТЕ, увидев ваше решение ниже - рад, что оно работает, возможно, будет ли чище (если вы все равно снимаете изображения с экрана для обработки ваших видов), чтобы иметь отдельный контроллер вида для управления переходом, передавая это два изображения, чтобы он мог выполнять анимацию внутри, поэтому вы перемещаете его на передний план без анимации, выполняете анимацию, начиная с изображения первого вида и заканчивая изображением второго вида (так что вы можете просто выполнять стандартную анимацию на двух изображениях imageViews). вместо полного представления контроллера), а затем нажмите второй контроллер представления, как только вы закончите?

...