为什么initWithPatternImage丢失了PNG的alpha值

时间:2011-02-23 03:49:30

标签: iphone objective-c textures alpha uicolor

有没有人见过[UIColor initWithPatternImage]忽略PNG alpha值的问题?如果是这样,最好的解决办法是什么?

我使用png作为我的按钮对象数组的背景图层,它包含图像中每个像素的几个预设alpha值,用作纹理背景。它作为图案/纹理颜色加载很好,但它所有的关键透明区域都是不透明的黑色。

重要的是我获得正确的alpha值,以便正确显示按钮图像。按钮框架不包括背景的alpha阴影,因为它不是按钮的“可点击”部分。此外,我的按钮对象的图像和背景图像也使用透明度,因此它需要在每个按钮后面都有一个清晰的背景,以便让正确的当前颜色设置正确(最低层UIView将其背景颜色设置为当前用户选择的颜色)。仅为包含此纹理的UIView图层设置单个alpha值也不能满足我的需要。

任何帮助将不胜感激。我目前的解决方法是使用png对多个UIImageView进行全面,重复编程的布局,而不是使用带有图案填充的单个UIView。

这是一段代码,但将UIImage转换为UIColor用作图案/纹理颜色非常标准:

    UIView *selectorView = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,320)];
    UIColor *background  = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"SelectorViewBackground.png"]];

    selectorView.backgroundColor = background;

    [mainView addSubview:selectorView]; // pattern background layer. Add UIButtons on top of this selectorView layer
    [self addSubview:mainView]; // current user selected color set in mainView.
    [selectorView release];
    [background release];

4 个答案:

答案 0 :(得分:3)

我在UIView上设置背景时遇到了同样的问题,有些透明, 这就是我解决它的方法:

theView.backgroundColor = [UIColor clearColor];
theView.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"the_image_with_transparancy.png"]].CGColor;

答案 1 :(得分:1)

这可能与:

有关

Tiled Background Image: Can I do that easily with UIImageView?

基本上,请尝试设置:

[view setOpaque:NO];
[[view layer] setOpaque:NO];

答案 2 :(得分:0)

不,我从来没有遇到过这个问题。我一直使用上面的代码来代替应用程序(虽然我经常将它与图层结合使用而不是视图,但这不应该对透明度的识别产生影响)并始终保持透明度正常。

我会查看您的PNG文件。我注意到iOS有时对某些PNG选项/类型(如8位PNG,8位透明度)很挑剔。确保您的PNG保存为24位,8位透明度(总共32位)。

另外,这是一个愚蠢的问题,但你确认你的PNG背后的视图/图层层次结构中没有任何黑色吗?有时这是愚蠢的事情

答案 3 :(得分:0)

对于那些可能需要处理代码的人来说,背景模式可以在UIScrollView中作为行布局,这里(调整以消除机密性问题,如果变量在调用之前正确设置,则应该有效)。

请注意,应该有多种方法可以多次重用UIImageView的一个分配实例,以节省内存或加载时间,但是上市时间是我现在的头号驱动程序。享受旅程:))

    UIImageView *selectorView;
    for (int i = 0; i < numRows; ++i) {
        selectorView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectorViewBackground.png"]];
        selectorView.frame = CGRectMake(0, i * patternHeight, patternWidth, patternHeight);
        [mainView addSubview:selectorView];
        [selectorView release];         
    }