Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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
Objective c 如何在应用程序中的每个位置设置navigationbar的图像_Objective C_Ios_Navigation_Storyboard - Fatal编程技术网

Objective c 如何在应用程序中的每个位置设置navigationbar的图像

Objective c 如何在应用程序中的每个位置设置navigationbar的图像,objective-c,ios,navigation,storyboard,Objective C,Ios,Navigation,Storyboard,我正在用故事板构建一个应用程序。现在,我希望在我的应用程序的每个屏幕上都有相同的topBar/navigationbar。我想在此导航栏上设置一个图像。经过一些搜索,我找到了这个代码 @implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"topbar.jpg"]; [image drawInRect:

我正在用故事板构建一个应用程序。现在,我希望在我的应用程序的每个屏幕上都有相同的topBar/navigationbar。我想在此导航栏上设置一个图像。经过一些搜索,我找到了这个代码

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed: @"topbar.jpg"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end  
我把它放在appdelagate.M文件中我的implementation的正上方。但它不起作用。 还有谁知道这在IOS 5.1中是否也起作用


亲切问候。

我曾使用swizzle drawRect。为此,您可以在+initialize时使用方法\u ExchangeImplements runtime.h执行swizzle。现在,棘手的部分是调用原始的drawRect,因为方法被swizzle,所以您需要使用自定义的drawing方法名称来调用原始的drawRect。例如,如果您使用绘制,您将拥有[super customDrawRect:rect];最后

- (void)customDrawRect:(CGRect)rect { 

   ... 
   [super customDrawRect:rect];
}

为此,我使用swizzle drawRect,您可以使用方法\u ExchangeImplements runtime.h在+initialize处执行swizzle。现在,棘手的部分是调用原始的drawRect,因为方法被swizzle,所以您需要使用自定义的drawing方法名称来调用原始的drawRect。例如,如果您使用绘制,您将拥有[super customDrawRect:rect];最后

- (void)customDrawRect:(CGRect)rect { 

   ... 
   [super customDrawRect:rect];
}
看看你的外表。它允许您在整个UI类中更改属性。例如,我在一个应用程序中有:

UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
[[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
iOS 5中引入了UI外观。旧的方法是重写-drawRect:像您所做的那样,为所讨论的类使用一个类别,例如UINavigationBar。Swizzling-将您的方法替换为SDK提供的方法-顺便说一句,这不是必需的

当iOS5出现时,我发现drawRect技巧不起作用,因此我必须有条件地使用UIAppearance,将上述代码封装在一个if语句中,如下所示:

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    ...
}
为什么是有条件的?我们继续支持iOS4,所以如果我们不将这个东西条件化,iOS4用户将遇到崩溃。因此,我们在应用程序中同时使用了这个和drawRect解决方案

如果您不必支持iOS4,那么您一定要查看UIAppearance以实现您的目标。

查看UIAppearance。它允许您在整个UI类中更改属性。例如,我在一个应用程序中有:

UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
[[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
iOS 5中引入了UI外观。旧的方法是重写-drawRect:像您所做的那样,为所讨论的类使用一个类别,例如UINavigationBar。Swizzling-将您的方法替换为SDK提供的方法-顺便说一句,这不是必需的

当iOS5出现时,我发现drawRect技巧不起作用,因此我必须有条件地使用UIAppearance,将上述代码封装在一个if语句中,如下所示:

if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    ...
}
为什么是有条件的?我们继续支持iOS4,所以如果我们不将这个东西条件化,iOS4用户将遇到崩溃。因此,我们在应用程序中同时使用了这个和drawRect解决方案


如果您不必支持iOS4,那么您一定应该在这里查看UIAppearance以实现您的目标。

非常抱歉,但我不理解您所说的任何内容。您是否有更详细的代码示例?我已经添加了代码,但这取决于您的检查,请让我知道您发现并解决了任何问题,以便我可以为其他人编辑文本。你可能会读到一些方法正在搜索或寻找其他源代码,有很多。谢谢你,但它在[self-customImageDrawRect:rect]错误上给出了以下错误:UINavigationBar的@interface不可见声明选择器“customImageDrawRect:”哦,对了,这是因为方法名为customDrawRect,并且缺少一个参数。非常抱歉,我不理解您所说的任何内容。您是否有更详细的代码示例?我已经添加了代码,但这取决于您的检查,请让我知道您发现并解决了任何问题,以便我可以为其他人编辑文本。你可能会读到一些方法正在搜索或寻找其他源代码,有很多。谢谢你,但它在[self-customImageDrawRect:rect]错误上给出了以下错误:UINavigationBar的@interface不可见声明选择器“customImageDrawRect:”哦,对了,这是因为方法名为customDrawRect,并且缺少一个参数。