我创建了一个简单的应用程序来播放不同的过渡动画,设置了几个分段控件和一个滑块。
(翻转/卷曲),(左/右)| (上/下), (EaseInOut/EaseIn/EaseOut/Linear)
我创建了一个视图控制器类,超级视图控制器在子类的 2 个实例之间切换。
从下图中可以看出,第一次切换到第二个实例时,在动画发生时,分段控件被破坏了;我猜他们还没有足够的时间来完全画出自己。
http://img689.imageshack.us/img689/2320/manangledbuttonsduringtra.png
一旦动画完成,它们就很好,以及任何后续时间。
如果我cache:NO
在其中指定setAnimationTransition
它会有所帮助,但是分段控件中的文本似乎仍然存在某种渐进式显示;它们似乎仍然没有被预渲染或正确初始化..(当然有一种方法可以在缓存转换到的视图时做到这一点,因为在这种情况下视图不会改变并且应该是可缓存的。)
我正在根据书中的几个教程构建我的代码,所以我更新了didReceiveMemoryWarning
将实例化视图控制器设置为 nil;当我在模拟器中调用内存警告时,我假设它正在清除另一个视图,并且它就像加载后的第一次转换,被转换到的视图就像上图一样。
我想包含代码不会有什么坏处(对不起,如果它被认为是垃圾邮件),这基本上是它的一半,在else
声明中后面有一个类似的块,对于第二面存在的情况,切换回第一个:
- (IBAction)switchViews:(id)sender
{
[UIView beginAnimations:@"Transition Animation" context:nil];
if (self.sideBViewController.view.superview == nil) // sideA is active, sideB is coming
{
if (self.sideBViewController == nil)
{
SideAViewController *sBController =
[[SideAViewController alloc] initWithNibName:@"SideAViewController" bundle:nil];
self.sideBViewController = sBController;
[sBController release];
}
[UIView setAnimationDuration:sideAViewController.transitionDurationSlider.value];
if ([sideAViewController.transitionAnimation selectedSegmentIndex] == 0)
{
// flip: 0 == left, 1 == right
if ([sideAViewController.flipDirection selectedSegmentIndex] == 0)
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
forView:self.view
cache:YES];
else
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight
forView:self.view
cache:YES];
}
else
{
// curl: 0 == up, 1 == down
if ([sideAViewController.curlDirection selectedSegmentIndex] == 0)
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp
forView:self.view
cache:YES];
else
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown
forView:self.view
cache:YES];
}
if ([sideAViewController.animationCurve selectedSegmentIndex] == 0)
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
else if ([sideAViewController.animationCurve selectedSegmentIndex] == 1)
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
else if ([sideAViewController.animationCurve selectedSegmentIndex] == 2)
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
else if ([sideAViewController.animationCurve selectedSegmentIndex] == 3)
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[sideBViewController viewWillAppear:YES];
[sideAViewController viewWillDisappear:YES];
[sideAViewController.view removeFromSuperview];
[self.view insertSubview:sideBViewController.view atIndex:0];
[sideBViewController viewDidAppear:YES];
[sideAViewController viewDidDisappear:YES];
}