我有一个UIView
容器,里面有两个UIImageView
,一个部分遮挡另一个(它们是这样组成的,以便偶尔动画一个“层”或另一个。
有时我想让这个容器50%alpha,所以用户看到的内容会消失。这就是问题:将我的容器视图设置为50%alpha会使我的所有子视图都继承这个,现在你可以看到第一个子视图进入第二个子视图,这在我的应用程序中有一个奇怪的X射线效果,我不是寻找。
当然,我所追求的是用户当前看到的变为50%透明 - 相当于将可见视图展平为一个位图,然后使其达到50%alpha。
我最好的选择是什么?理想情况下,如果我可以帮助它,实际上可以避免动态展平视图,但也欢迎这种欢迎的最佳实践。我错过了一些明显的东西吗由于大多数视图都有子视图并会遇到这个问题,我觉得这里有一些明显的解决方案。
谢谢!
编辑:感谢大家的想法。我只是将一个图像移动到另一个图像的顶部,它只是部分模糊。这对图像有时也必须一起移动。有时我想把整个事物淡出,无论它在哪里,以及目前图像对的状态如何。之后,我想把它带回来并继续制作动画。
拍摄容器的快照,通过渲染其图层(?)或通过动画执行其他一些屏幕外合成,然后才能完成整个事情,这绝对是可能的,我知道有几种方法可以做到这一点。但是,如果动画应该继续发生,而整个事物处于50%alpha,那该怎么办呢?
这听起来似乎没有明显的解决方案我正在尝试做什么,这对我来说似乎很奇怪,但是谢谢大家的意见。
答案 0 :(得分:3)
最近我遇到了同样的问题,我需要使用全局透明度来动画内容层。由于我的动画非常复杂,我发现将UIView层次结构弄平为一个不稳定的动画。
我找到的解决方案是使用CALayers而不是UIViews,并在容器层中将.shouldRasterize
属性设置为YES
,以便在应用不透明度之前自动展平所有子图层。
以下是UIView的样子:
#import <QuartzCore/QuartzCore.h> //< Needed to use CALayers
...
@interface MyView : UIView{
CALayer *layer1;
CALayer *layer2;
CALayer *compositingLayer; //< Layer where compositing happens.
}
...
- (void)initialization
{
UIImage *im1 = [UIImage imageNamed:@"image1.png"];
UIImage *im2 = [UIImage imageNamed:@"image2.png"];
/***** Setup the layers *****/
layer1 = [CALayer layer];
layer1.contents = im1.CGImage;
layer1.bounds = CGRectMake(0, 0, im1.size.width, im1.size.height);
layer1.position = CGPointMake(100, 100);
layer2 = [CALayer layer];
layer2.contents = im2.CGImage;
layer2.bounds = CGRectMake(0, 0, im2.size.width, im2.size.height);
layer2.position = CGPointMake(300, 300);
compositingLayer = [CALayer layer];
compositingLayer.shouldRasterize = YES; //< Here we turn this into a compositing layer.
compositingLayer.frame = self.bounds;
/***** Create the layer three *****/
[compositingLayer addSublayer:layer1]; //< Add first, so it's in back.
[compositingLayer addSublayer:layer2]; //< Add second, so it's in front.
// Don't mess with the UIView's layer, it's picky; just add sublayers to it.
[self.layer addSublayer:compositingLayer];
}
- (IBAction)animate:(id)sender
{
/* Since we're using CALayers, we can use implicit animation
* to move and change the opacity.
* Layer2 is over Layer1, the compositing is partially transparent.
*/
layer1.position = CGPointMake(200, 200);
layer2.position = CGPointMake(200, 200);
compositingLayer.opacity = 0.5;
}
答案 1 :(得分:2)
我认为将UIView扁平化为UIImageView是您最好的选择,如果您已经开始提供此功能。此外,我认为平整图像并不像你想象的那么复杂。请查看this question中提供的答案。
答案 2 :(得分:0)
将底部UIImageView设置为.hidden = YES
,然后在顶部和底部UIImageViews之间设置交叉渐变动画时设置.hidden = NO
。
当您需要淡化整个事物时,您可以在容器视图或顶部图像视图上设置.alpha = 0.5
- 这应该无关紧要。在图像视图本身上设置.alpha = 0.5
可能在计算上更有效,但我对iPhone上的图形管道知之甚少,无法确定。
这种方法的唯一缺点是,当您的顶部图像设置为50%不透明度时,您无法进行交叉淡入淡出。
答案 3 :(得分:-1)
这样做的方法是将ImageViews添加到UIWindow(容器将是假的)