2012-04-25 67 views
13

我正在編寫我的第一個iOS應用程序,面向iOS 5.0+平臺。我正在使用UIAppearance協議來定製應用程序UI。UIImage resizableImageWithCapInsets:無法按預期工作

我試圖在整個應用程序中更改UIBarButtonItem的背景。由於我的UIBarButtonItem的尺寸可能會根據所使用的文本或圖標而改變大小,因此我試圖將UIImage resizableImageWithCapInsets:用於我的背景PNG。

我最初在Ray Wenderlich上找到了我需要的代碼。使用相同的確切代碼,與上述教程中使用的圖像非常接近,我得到了奇怪的結果。也許這只是我對Cocoa Touch的缺乏經驗。

這是我正在使用的代碼。

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
      resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)]; 

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
             forState:UIControlStateNormal 
             barMetrics:UIBarMetricsDefault]; 

這裏是我試圖使用

png background

的PNG背景圖片這裏是結果(模擬器)

result of trying to use resizableImageWithCapInsets:

回答

19

您的圖像在leftright之間,以及topbottom之間的部分平鋪以填充圖像所需的空間。試試UIEdgeInsetsMake(15, 6, 15, 6)

概括而言,如果圖像具有連續漸變,則重複部分應該只有1個像素高。由於您的按鈕圖像的像素高度爲31像素,因此topbottomUIEdgeInsetsMake的第一個和第三個參數)應該增加到30個。它們不必相同。 UIEdgeInsetsMake(8, 6, 22, 6)會將重複的部分向上移動,從而導致較淡的背景。

此外,您附加的文件的平原或視網膜('@ 2x')版本的圖像?插圖必須在普通版本的大小範圍內。

+0

感謝您的答覆。發佈的圖片是@ 2x。所以我應該把我的測量值切成(0,3,0,3)?你是說我應該把我的圖像中間放大1px?我明白爲什麼會這樣,但我跟着的教程有一個30像素×40像素的圖像,具有與我自己相同的樣式漸變,並且它看起來非常棒(使用現在使用的UIEdgeInsetsMake,只需調整一個像素因爲我的角落半徑)。 – 2012-04-25 12:20:22

+0

這裏的技巧:你可以使用0作爲頂部和底部_if_你的背景圖像與導航欄按鈕的高度相同。它只是用您現有的漸變填充該空間。您的圖像不是視網膜導航按鈕的高度,因此它將被拉伸或重複以填充該高度。您必須提供頂部和底部大小(第一個和第三個參數)。以'(7,3,7,3)'開頭。這將留下一些條紋,但希望能更清楚地瞭解發生了什麼。 – Dondragmer 2012-04-25 12:34:09

+0

啊,這確實有點意義。視網膜navBar按鈕的大小是多少?我將我的用戶界面元素從一個視網膜大小的PSD文件中切出,所以如果我需要在psd文件中將navBar按鈕設置得更大,然後將其導出以獲得我需要的內容,那麼這對我來說會很容易。 – 2012-04-25 13:06:24

17

我有完全相同的問題。

你可以做的另一件事是設置UIImageResizingModeStretch的resizingMode。它解決了我的問題。

Hopwever,它不在IOS5中可用。所以我的解決辦法就是像別人所說的那樣去做。意識到花木方應該只是一個像素。無論如何,大多數按鈕在中間變化不大。

所以,使用此代碼:

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset 
    { 
     if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)]) 
     { 
      return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch]; 
     } 
     else 
     { 
      float left = (self.size.width-2)/2;//The middle points rarely vary anyway 
      float top = (self.size.height-2)/2; 
      return [self stretchableImageWithLeftCapWidth:left topCapHeight:top]; 
     } 
    } 
+3

感謝您花時間回答這個問題,即使它是一個較舊的帖子。非常感激! – 2012-10-19 16:35:29

+1

其他答案並不能真正解決問題。謝謝。 – 2012-10-20 13:17:57

+1

謝謝!爲我工作很好。 – 2013-04-18 14:15:02