Почему новый UIImageView не может анимировать?

У меня есть такой код в моем приложении для iPhone:

//fromView is a UIImageView. 
//self is a UIView.
        UIGraphicsBeginImageContext(fromView.bounds.size); 
        [fromView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
        UIImage *dummyFromImage = UIGraphicsGetImageFromCurrentImageContext(); 
        UIGraphicsEndImageContext();
        UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:dummyFromImage]; 
        [self addSubview:dummyImageView];
        [UIView beginAnimations:nil context:nil]; 
        [UIView setAnimationDuration:0.5]; 
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: dummyImageView cache:YES]; //line:9 
        [UIView commitAnimations];

DummyImageView только отображается, но никогда не переворачивается, если вы измените dummyImageView в line9 на fromView, fromView сделает переворот. Скажите, пожалуйста, почему?


person Tinyfool    schedule 12.04.2010    source источник


Ответы (2)


Я задаю этот вопрос в службу технической поддержки Apple Developer, они сказали,

«Основная проблема заключается в том, что из-за времени вашей анимации нет «предыдущего» состояния для анимации Core Animation, поскольку представление было только что добавлено в иерархию представлений, и поэтому при попытке перехода все, что он может сделать, отображает «конечное» состояние.

Если вместо этого вы выполняете переворот на следующей итерации цикла выполнения, у Core Animation будет время создать начальное состояние для слоя представления, и, таким образом, переворот произойдет правильно. Вы можете сделать это, разделив свой метод flip на два и используя -performSelector:withObject:afterDelay: вот так:

-(IBAction)flip {

   UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:fromView.image];
   dummyImageView.frame = fromView.frame;
   [window addSubview:dummyImageView];

   [self performSelector:@selector(animate:) withObject:dummyImageView afterDelay:0.0];
}

-(void)animate:(UIView*)view {

   [UIView beginAnimations:nil context:nil];
   [UIView setAnimationDuration:0.5];
   [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: view cache:YES];
   [UIView commitAnimations];
}

Однако, поскольку вы упомянули, что «fromView» является UIImageView, мне интересно, почему вы используете -renderInContext: более эффективно просто использовать то же изображение, что и «fromView», и назначить его в качестве изображения для вашего нового UIImageView, так как это экономит как процессорное время, так и память, тем более что я заметил в вашем образце, что изображение меньше, чем представление, которое вы используете.

person Tinyfool    schedule 03.12.2010

    [UIView setAnimationTransition:… forView: dummyImageView cache:YES]; //line:9 

Представление в методе -setAnimationTransition:… должно быть назначено представлению, которое содержит изменение. В вашем случае self.

Сам dummyImageView не изменяется (внешние изменения, такие как изменение супервизора, не имеют значения), поэтому анимация ничего не может сделать.

person kennytm    schedule 12.04.2010