2011-02-23 58 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

相關問題