如何防止视图在自定义UIStoryboardSegue结束时“闪烁”?

时间:2012-09-16 01:06:02

标签: ios objective-c ios5 uistoryboardsegue

我编写了一个自定义UIStoryboardSegue,我用它来转换各种UIViewControllers。动画按照需要工作,UIStoryboardSegue显示的大部分时间都是我在模拟器和设备上所期望的。

但是,有时在segue完成后,我会在UIViewController完成后的几分之一秒内看到旧的UIStoryboardSegue 闪烁。结果破坏了我期待的平稳过渡。不幸的是,我无法辨别出这种行为的任何模式。

我已经包含了我用来管理下面的segue的方法的准系统版本。是否有更可靠的方法来确保平滑过渡?难道我做错了什么?同样,很多时候segue看起来就像我想要的那样。

- (void)perform
{
    self.window = [[[UIApplication sharedApplication] delegate] window];
    UIViewController *source = (UIViewController *) self.sourceViewController;
    UIViewController *dest = (UIViewController *) self.destinationViewController;

    [self.window insertSubview:dest.view.window belowSubview:source.view];

    self.segueLayer = [CALayer layer];
    // Create and add a number of other CALayers for displaying the segue,
    // adding them to the base segueLayer

    // Create and add CAAnimations for animating the CALayers
    // (code omitted for the sake of space)

    [self.window addSubview:dest.view];
    [self.window.layer addSublayer:self.segueLayer];

    [source.view removeFromSuperview];
}

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)isFinished
{
    UIViewController *source = (UIViewController *) self.sourceViewController;
    UIViewController *dest = (UIViewController *) self.destinationViewController;

    if (isFinished)
    {
        // Remove and deallocate the CALayers previously created 
        [self.segueLayer removeFromSuperlayer];
        self.segueLayer = nil;
        self.window.rootViewController = dest;
    }
}

1 个答案:

答案 0 :(得分:2)

因此,CAAnimations不会更改实际图层的值,而是更改其关联的presentationLayer的值。将fillMode设置为kCAFillModeForwards可确保动画完成后presentationLayer的值不会恢复。但是,如果动画的removedOnCompletion属性设置为YES(默认情况下),则图层的外观也可以恢复到动画前的状态。

由于animationDidStop:回调可能在任何潜在的逆转之后被调用,并且由于时间不准确,这可以解释为什么你不总是看到回归。