Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从iOS 4切换到iOS 5时出现NavigationBarStyle问题_Iphone_Ios_Coding Style_Navigationbar - Fatal编程技术网

Iphone 从iOS 4切换到iOS 5时出现NavigationBarStyle问题

Iphone 从iOS 4切换到iOS 5时出现NavigationBarStyle问题,iphone,ios,coding-style,navigationbar,Iphone,Ios,Coding Style,Navigationbar,升级到iOS 5和Xcode 4.2后出现了一些设计问题 这就是我在iOS 4中的视图: 这就是iOS 5中的情况: 在我的导航代理中,我使用以下方法在顶部绘制“图像”: - (void)drawRect:(CGRect)rect { UIImage *image; if(self.barStyle == UIBarStyleDefault){ image = [UIImage imageNamed: @"topbar_base.png"]; }

升级到iOS 5和Xcode 4.2后出现了一些设计问题

这就是我在iOS 4中的视图:

这就是iOS 5中的情况:

在我的导航代理中,我使用以下方法在顶部绘制“图像”:

- (void)drawRect:(CGRect)rect {
    UIImage *image;
    if(self.barStyle == UIBarStyleDefault){
        image = [UIImage imageNamed: @"topbar_base.png"];
    }
    else{
        image = [UIImage imageNamed: @"nyhedsbar_base.png"];    
    }
    [image drawInRect:CGRectMake(-1, -1, self.frame.size.width+3, self.frame.size.height+3)];
}
在我的控制器内,我设置了以下各项:

self.navigationBarStyle = UIBarStyleBlack;
为什么它在iOS 5中不工作


谢谢

在iOS5下,您需要使用
UIAppearance
。看看那个。下面是一个有条件地使用它的示例,以便您可以继续支持iOS4:

// iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}

如您所见,这将为所有UINavigationBars设置自定义背景图像。你可以用你的外表做很多事情。您需要保留当前在
drawRect:
中执行的任何自定义操作,因为iOS4之前的设备仍将使用该代码,而不是新的UIAppearance代码。

在iOS5下,您需要使用
UIAppearance
。看看那个。下面是一个有条件地使用它的示例,以便您可以继续支持iOS4:

// iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}

如您所见,这将为所有UINavigationBars设置自定义背景图像。你可以用你的外表做很多事情。您需要保留当前在
drawRect:
中所做的任何自定义内容,因为iOS4之前的设备仍将使用这些内容,而不是新的UIAppearance代码。

是否对自定义图形使用子类化或类别?是否对自定义图形使用子类化或类别?如果使用子类化(而不是类别,我怀疑Casper Slynge可能在做)您可以对iOS5和下面的所有内容使用相同的代码。在我的特殊情况下,上面的代码是在我们测试iOS5兼容性时添加的。我们在一个类别中定义了drawRect:以执行与OP类似的操作。我们保留了drawRect代码,用于iOS5之前的设备;显然,它不在iOS5下调用。此外,UIAppearance代码above必须在系统调用drawRect代码之前调用(在应用程序中:didFinishLaunchingWithOptions:)才能生效。因此,上面的代码将应用于每个导航栏。如果我想在两个不同的图像之间切换怎么办?是的,我基本上就是这么说的:)根据苹果的文档,在categories中重写方法是错误的,而且一直都是错误的(无意冒犯),但在许多教程中都是这样做的。@Casperlynge我认为在本例中,您可以通过稍微不同的UIAppearance用法来实现这一点。我相信您可以为出现在其他类中的类指定外观特征,甚至可以为给定类的对象指定外观特征。老实说,我解决了我的问题,并继续下一个问题,而没有深入挖掘。(这样做当然在我的待办事项清单上!)如果您使用子类化(而不是类别,我怀疑Casper Slynge可能正在这样做),您可以对iOS5和下面的所有内容使用相同的代码。在我的特殊情况下,上面的代码是在测试iOS5兼容性时添加的。我们在一个类别中定义了drawRect:来做与OP类似的事情。我们保留了drawRect代码,用于iOS5之前的设备;显然,它不是在iOS5下调用的。此外,上面的UIAppearance代码必须在系统调用drawRect代码之前调用(在application:didFinishLaunchingWithOptions:)才能生效。因此,上面的代码将适用于每个导航栏。如果我想在两个不同的图像之间切换怎么办?是的,这基本上就是我要说的:)根据苹果的文档,覆盖类别中的方法是错误的,而且一直都是错误的(无意冒犯),但在许多教程中都是这样做的。@Casperlynge我认为在这种情况下,您可以通过稍微不同的UIAppearance使用来实现这一点。我相信您可以为出现在其他类中的类指定外观特征,甚至可以为给定类的对象指定外观特征。老实说,我解决了我的问题,并继续下一个问题,而没有深入挖掘。(这样做当然在我的待办事项清单上!)