我的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,请告诉我为什么?
答案 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
本身没有改变(改变超视图等外部变化无关紧要),因此动画无效。