UIView 的淡入淡出效果可以让子视图显示出来。

8
我有一个包含各种子视图(UIImageViewsUILabels和标准的UIViews)的UIScrollView。其中一些UIImageViews被其他UIViews部分覆盖。

然而,当我淡出UIScrollView时,UIImageViews的部分被覆盖的部分在动画的短暂时刻被暴露出来。

我想能够同时淡化滚动视图及其所有内容,实现相同的动画 - 即不显示任何部分被覆盖的图像。

如果不可能,我可以始终添加一个UIView在所有其他控件的顶部,并从alpha 0到1淡入以隐藏所有内容,但我相信有一种方法可以对视图及其所有子视图执行完全的淡化。

我尝试了这个:

[UIView beginAnimations:nil context:NULL];
[scrollViewResults setAlpha:0.0f];
[UIView commitAnimations];

我已经尝试过这个:

- (IBAction)questionGroupChanged:(UIButton*)sender {
    [UIView beginAnimations:nil context:NULL];
    [self fadeViewHierarchy:scrollViewResults toAlpha:0.0f];
    [UIView commitAnimations];
}

- (void)fadeViewHierarchy:(UIView*)parentView toAlpha:(float)alpha {
    [parentView setAlpha:alpha];
    for (UIView *subView in parentView.subviews) {
        [self fadeViewHierarchy:subView toAlpha:alpha];
    }
}

但是我仍然没有解决它。有什么想法吗?
3个回答

14

这是因为合成器的工作方式所致。当淡入/淡出视图时,您需要在视图的图层上启用栅格化:

view.layer.shouldRasterize = YES;

由于这会占用一些额外的内存和图形处理时间,因此您应该仅在动画期间启用它。


2
还要记得设置正确的比例,否则你的光栅淡出在视网膜显示屏上看起来会很糟糕。view.layer.rasterizationScale = [UIScreen mainScreen].scale; - dizy

5

迈克的回答是正确的,他应该得到所有的赞誉。只是为了举例说明,它可能会像这样:

- (void)fadeView:(UIView*)view toAlpha:(CGFloat)alpha
{
    view.layer.shouldRasterize = YES;

    [UIView animateWithDuration:0.75
                     animations:^{
                         view.alpha = alpha;
                     }
                     completion:^(BOOL finished){
                         view.layer.shouldRasterize = NO;
                     }];
}

因此,使用您的scrollViewResults,它将被调用为:
[self fadeView:scrollViewResults toAlpha:0.0f];

感谢 @Rob 的说明。 - Stephan

-2

你尝试过使用UIView类方法+animateWithDuration:*(适用于iOS 4及以上版本)吗?

例如:

- (void)fadeAllViews
{
     [UIView animateWithDuration:2
     animations:^{
         for (UIView *view in allViewsToFade)
             view.alpha = 0.0;
     }
     completion:^(BOOL finished){}
     ];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接