为什么新的UIImageView无法动画?

时间:2010-04-12 13:26:18

标签: iphone ipad 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只显示但从不翻转,如果你将line9的dummyImageView改为fromView,fromView do flip,请告诉我为什么?

2 个答案:

答案 0 :(得分:3)

我向Apple开发者技术支持部门提出这个问题,他们说,

“基本问题是,由于动画的时间安排,Core Animation没有”先前“状态,因为视图刚刚添加到视图层次结构中,因此当尝试转换时,所有它可以做的是显示“最终”状态。

如果您在下一个runloop迭代中执行翻转,那么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,因为这节省了CPU时间和内存,特别是因为我在您的示例中注意到图像小于您正在使用的视图。

答案 1 :(得分:1)

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

-setAnimationTransition:…方法中的视图应分配给包含更改的视图。在您的情况下,self

dummyImageView本身没有改变(改变超视图等外部变化无关紧要),因此动画无效。