隐藏在ViewWillAppear中的UIImageView并取消隐藏在viewWillDisappear中的'闪烁'问题

时间:2014-01-26 21:15:45

标签: ios objective-c uiview uinavigationcontroller uiimageview

我在导航控制器的navigationBar的根视图控制器中有一个logo imageView,作为子视图添加,当我呈现一个细节控制器(在本例中是一个webView控制器)时,我动画并将徽标的alpha设置为0。现在,在webView控制器的viewWillDisappear中,我将相同徽标的alpha动画回1.0。

问题是,当您使用交互式边缘手势进行弹出时,而是选择取消弹出(返回到webView控制器)当webView完全显示然后返回时,徽标的alpha会短暂显示回1.0如果你愿意的话,就像它应该的那样,给它一个0的alpha值。如果愿意的话,它会像一个令人讨厌的'闪烁'。

我已经失去了如何解决这个问题,并且感谢所提供的任何帮助/指示。

问题的代码和截图:

enter image description here

@implementation WebViewController

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    UIImageView *view = (UIImageView *) [self.navigationController.navigationBar viewWithTag:1];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.35];
    view.alpha = 0.0;
    [UIView commitAnimations];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    UIImageView *view = (UIImageView *) [self.navigationController.navigationBar viewWithTag:1];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.35];
    view.alpha = 1.0;
    [UIView commitAnimations];
}

1 个答案:

答案 0 :(得分:1)

问题是除非在GPU上运行的动画逻辑设计用于处理这种变化,否则你无法在动画中间改变事物。

UINavigationController已经开始动画,在动画运行时没有任何内容可以改变。您的动画需要在导航控制器之前设置。

如果您想要这种级别的控制,请不要使用UINavigationController。它被设计为以某种方式使用,并且您尝试以其他方式使用它。即使你找到一种方法使它工作,你将有bug。如果你做这种事情,你的应用程序在iOS 8上运行的可能性极小。

编写您自己的UINavigationController替代品,其行为符合您的要求,然后您可以轻松实现的任何动画都将很容易实现。

但是,请记住,Apple的工程师比世界上任何人都更了解iOS编程,并且用来编写UINavigationController。如果你的替代品一样好,你将不得不投入那么多工作。如果值得付出努力,由你决定。