2011-02-23 34 views
3

任何人都看过[UIColor initWithPatternImage]忽略了PNG的alpha值的问题?如果是这样,最好的解决办法是什么?为什么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]; 

回答

0

不,我从来没有过的问题与此有关。我一直使用类似上述代码的应用程序(尽管我经常将它与一个图层结合使用,而不是视图,但这不应该与被识别的透明度有所不同),并始终保持透明度的正常工作。

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

另外,愚蠢的问题,但你有没有验证PNG背后的视图/层次结构中没有黑色的东西?有时候这就是那种愚蠢的东西

+0

嗨Jay,非常感谢您的回复。是的,我三重检查了PNG,后面的任何视图,它总共为32位。由于所有内容都位于滚动视图内,所以最后我选择创建多个UIImageView,并根据UIButton的行数创建多个UIImageView,它也很容易与UIButtons数组一起滚动。相同的PNG具有与UIImageView一样的透明效果。有一天,如果我有时间,我会检查使用图层时的差异。干杯! :) – 2011-02-24 04:13:46

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];   
    } 
+0

如果你重复使用完全相同的图像,为什么你要为每个循环创建一个新的图像?将UIImage存储在循环外部,然后在循环中将您的视图分配给它。为您节省一大堆电话,花费的时间比我在这篇评论中输入的时间要少。 – Jay 2011-02-24 07:17:49

+0

我知道。当我将代码复制到发布中时,我想到了它。首先拉出我的头发,以便在截止日期前得到所有东西......我将尽快清理它。再次感谢周杰伦。 – 2011-02-24 14:47:59

3

我有同样的问题上设置背景UIView与一些透明度, 这是我如何解决它:

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

大部分时间里我都在为我工作,但问题是它可能会颠倒给定的图像。一个可能的解决方案可能是:http://stackoverflow.com/a/5917849/936957 – 2013-03-12 12:49:25

相关问题