0

我创建了一个简单的应用程序来播放不同的过渡动画,设置了几个分段控件和一个滑块。

(翻转/卷曲),(左/右)| (上/下), (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];
    }
4

1 回答 1

0

看来我已经将sideBViewController(insertSubView)插入到比sideA低的索引处,然后这个视觉问题就不会发生了。

我尝试在viewDidLoad中创建sideB和sideA,但问题仍然存在,直到我将sideB添加到视图中的索引低于sideA ..

还有很多要学...

于 2010-05-19T20:39:54.420 回答