2011-06-08 47 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