2011-06-08 144 views
27

下載IOS5 SDK昨天,該代碼停止工作。如果我將目標設置爲IOS4.3及更低版本,它仍然有效。自定義背景圖片在IOS5 SDK

[self.bizToolbar insertSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"navbar-iphone.png"]] autorelease] atIndex:0]; 

有人在iOS 5上遇到過這個問題嗎?

+2

iOS5的是保密協議,所以我覺得你可以討論它在蘋果的專用論壇唯一 – Vladimir 2011-06-08 18:36:18

回答

49

您可以使用:[[UIToolBar appearance] setBackgroundImage:toolBarIMG forBarMetrics:UIBarMetricsDefault];(新iOS 5中)

+0

這真是太棒了,因爲它整齊地爲所有導航欄設置背景,所以不必爲每個導航欄都做。感謝您指點我正確的方向。 – Chris 2011-11-09 00:24:01

+0

任何UIToolbar的等價物? – Chris 2011-11-09 00:31:11

+59

[[UIToolbar外觀] setBackgroundImage:barsBack forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault] – Chris 2011-11-09 00:33:56

3

此方法未記錄,並依賴於UIToolbar的特定子視圖的結構可以從版本更改爲版本。所以這正是可能與iOS5的發生釋放

附:如果檢查更新UIToolBar class參考,你會發現另一種方式來定製UIToolBar

+0

Validmir感謝指針。我會檢查文檔。我現在就試過了,它適用於所有IOS版本。 @interface WoodenToolbar:UIToolbar {} - (無效)的drawRect:(的CGRect)RECT; @end @implementation WoodenToolbar - (無效)的drawRect:(的CGRect)RECT { 的UIImage *圖像= [UIImage的imageNamed:@ 「Navbar的iphone.png」]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end – StackThis 2011-06-08 18:47:57

35

假設你的iOS5鏈接SDK測試版,你可以做這樣的事情

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { 
     //iOS 5 new UINavigationBar custom background 
     [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault]; 
} 

爲了實現這一目標, 看看這裏iOS 4.3 to iOS 5.0 API Differences 並搜索「UINavigationBar.h」

,或採取在這裏的新方法簽名 setBackgroundImage:forBarMetrics:

仔細看

而且這裏是UIBarMetrics枚舉類型

希望這有助於。

+0

非常感謝!這工作完美 – shabbirv 2011-08-04 15:51:38

10

這個工作我的工具欄上:

//toolBar background image set based on iOS version 
    [[UIDevice currentDevice] systemVersion]; 

    if ([[[UIDevice currentDevice] systemVersion] floatValue] > 4.9) { 

     //iOS 5 
     UIImage *toolBarIMG = [UIImage imageNamed: @"toolBar_brown.png"]; 

     if ([toolBar respondsToSelector:@selector(setBackgroundImage:forToolbarPosition:barMetrics:)]) { 
      [toolBar setBackgroundImage:toolBarIMG forToolbarPosition:0 barMetrics:0]; 
     } 

    } else { 

     //iOS 4 
     [toolBar insertSubview:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"toolBar_brown.png"]] autorelease] atIndex:0]; 

    } 
+6

沒有必要檢查系統版本(這通常不是一個好的做法),因爲'-respondsToSelector'檢查應該足以確定是否使用新方法或舊方法來做到這一點。 – 2011-11-17 17:51:39

+0

ios5運行良好,但ios 4沒有響應。我該怎麼辦? – Hiren 2012-03-19 10:29:36

0

這是在同一直線上的Simone的答案,但適用於iOS 5和iOS < 5.這是我在應用程序中使用的。你需要在你的應用程序初始化的某個地方調用[UINavigationBar setupIos5PlusNavBarImage](applicationDidFinishLaunching:是一個很好的候選者)。在iOS 5+上,setupIos5PlusNavBarImage將使用新的UIAppearance協議來設置背景,並且drawRect覆蓋將被忽略。在iOS < 5上,setupIos5PlusNavBarImage基本上是無操作,drawRect將處理繪製圖像。

接口:

@interface UINavigationBar (CustomNavigationBar) 

+ (void) setupIos5PlusNavBarImage; 

- (void) drawRect: (CGRect) rect; 

@end 

實現:

@implementation UINavigationBar (CustomNavigationBar) 

+ (void) setupIos5PlusNavBarImage 
{ 
    if ([UINavigationBar respondsToSelector: @selector(appearance)]) 
    { 
     [[UINavigationBar appearance] setBackgroundImage: [UIImage imageNamed: @"menuBar.png"] forBarMetrics: UIBarMetricsDefault]; 
    } 
} 

- (void) drawRect: (CGRect) rect 
{ 
    UIImage* img = [UIImage imageNamed: @"menuBar.png"]; 
    [img drawInRect: CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end