淡化UIView允许查看子视图

the*_*ncs 8 animation alpha objective-c uiview ios

我有一个UIScrollView包含各种子视图(UIImageViews,UILabels和标准UIViews).其中一些UIImageViews部分被其他人覆盖UIViews.

但是,当我淡出时UIScrollView,部分覆盖的部分UIImageViews会在动画的短暂时刻曝光.

我希望能够在同一动画中同时淡出滚动视图及其所有内容 - 即不显示任何部分覆盖的图像.

如果不可能的话,我总是可以UIView在所有其他控件之上添加一个并从alpha 0到1淡化它以隐藏所有内容,但我确信有一种方法可以对视图及其所有子视图执行完全淡入淡出.

我试过这个:

[UIView beginAnimations:nil context:NULL];
[scrollViewResults setAlpha:0.0f];
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

我试过这个:

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

但我还是没有破解它.有任何想法吗?

Mik*_*ler 14

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

view.layer.shouldRasterize = YES;
Run Code Online (Sandbox Code Playgroud)

您应该只在动画期间启用它,因为它会占用一些额外的内存和图形处理时间.

  • 另外,不要忘记设置适当的刻度,否则光栅化的淡化会在视网膜显示器上看起来很糟糕.view.layer.rasterizationScale = [UIScreen mainScreen] .scale; (2认同)

Rob*_*Rob 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;
                     }];
}
Run Code Online (Sandbox Code Playgroud)

因此,使用your scrollViewResults,它将被调用为:

[self fadeView:scrollViewResults toAlpha:0.0f];
Run Code Online (Sandbox Code Playgroud)