淡化UIView允许查看子视图

时间:2012-10-10 15:21:07

标签: objective-c ios animation uiview alpha

我有一个UIScrollView,其中包含各种子视图(UIImageViewsUILabels和标准UIViews)。部分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 个答案:

答案 0 :(得分:14)

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

view.layer.shouldRasterize = YES;

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

答案 1 :(得分: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];

答案 2 :(得分:-2)

您是否尝试使用UIView类方法+ animateWithDuration:*(在iOS 4和+上可用)

喜欢:

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