UIView transitionFromView: toView: не анимация - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь анимировать переход для одного конкретного подвида среди многих. Первоначально, когда я пытался выполнить transitionFromView:toView:, он анимировал весь superView, а это не то, что я хочу. Я только хочу, чтобы определенные subViews оживляли. Поэтому я искал и нашел следующее: Поведение перехода с использованием transitionFromView и transitionWithView , которое предлагает создать контейнерное представление для выполнения анимации. Хорошо, достаточно просто, поэтому я придумал этот код:

UIView *container = [[UIView alloc] init];
container.frame = selected.frame;
selected.frame = container.bounds;
[selected.superview addSubview:container];
[container addSubview:selected];
[UIView transitionFromView:selected toView:normal duration:.2f options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL fin){
    normal.frame = container.frame;
    [container.superview addSubview:normal];
    [container removeFromSuperview];
}];

Но теперь у меня вообще нет анимации. Я, наверное, упускаю что-то простое, но не могу найти это. Есть идеи?

UPDATE

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

(gdb) po normal
<SLabel: 0x9c43150; frame = (0 0; 40 40); text = '28'; tag = 28; layer = <CALayer: 0x9c43190>>
(gdb) po selected
<SLabel: 0x9ca5f00; frame = (137 148; 45 37); text = '28'; tag = 28; layer = <CALayer: 0x9c596b0>>
(gdb) po [normal superview]
Can't print the description of a NIL object.
(gdb) po [selected superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>

После того, как код прошел через строку 5 (непосредственно перед методом перехода), я получаю:

(gdb) po container
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>
(gdb) po [container superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>
(gdb) po [selected superview]
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>

Так что все кажется правильным. Контейнер размещается в месте выбранного представления (это представление, из которого я хочу перевернуть). Контейнер добавлен в суперпредставление выбранного представления. Выбранный вид помещается внутри контейнера. И, наконец, переход выполняется (после очистки). Но я все еще не получаю анимацию ... переход происходит немедленно.

Обратите внимание, что переход между представлениями происходит правильно. Я просто не получаю никакой анимации.

Еще один вопрос: должны ли переходные виды быть подпредставлением, независимо от того, насколько оно далеко, представления UINavigationController для выполнения анимации? Я никогда не видел такого требования, которое мог бы запомнить, но это один нестандартный аспект моего кода. Если вы будете следовать суперпредставлениям каждого вида, ни один из них не будет частью контроллера навигации до того, как он попадет в окно. Иногда фреймворки Apple неожиданно зависят друг от друга ... Мне было интересно, если это один из них.

Окончательный ответ состоял в том, что весь мой код был верным. Происходило то, что layoutSubviews вызывали после того, как я запустил анимацию, которая перестраивала все мои подпредставления еще до того, как анимация имела шанс начать. Я не совсем уверен, почему это называется. Я не вызывал его из своего кода, поэтому по какой-то причине мои движущиеся представления вызывали UIView, чтобы вызвать его, я думаю. Во всяком случае, я переместил свой код из layoutSubviews в закрытый метод и вызываю его только тогда, когда изменяется размер представления. Теперь все работает. :)

1 Ответ

0 голосов
/ 28 марта 2012

Код, который вы там поместили, не содержит ошибок, единственное, что я могу подумать, это то, что у вас есть проблемы в другом месте.Вы уверены, что ваше контейнерное представление соответствует отображаемому представлению?

В каком методе вы его вызываете?

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

UIView* normalView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[normalView setBackgroundColor:[UIColor redColor]];
UIView* selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[selectedView setBackgroundColor:[UIColor blueColor]];

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[container setBackgroundColor:[UIColor grayColor]];

[container addSubview:selectedView];
[self.view addSubview:container];

И затем вызываете метод, чтобы выполнить переворот.

[UIView transitionFromView:selectedView toView:normalView duration:2.0 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL fin){}];
...