自定义UINavigationController UIToolbar背景图片

Chr*_*ris 16 cocoa-touch objective-c uitoolbar uinavigationcontroller

我有一个iPhone应用程序使用,UINavigationController并希望自定义背景图像元素.我能够UINavigationController's UINavigationBar很容易地使用Objective-C类别,如下所示:

http://foobarpig.com/iphone/uinavigationbar-with-solid-color-or-image-background.html

我想为此做同样的事情UINavigationController's UIToolbar,但同样的方法似乎不起作用(虽然我完全不知道为什么不这样做.)我环顾四周,人们似乎建议进行子类化UIToolbar,但这是不可能的对于UINavigationController's工具栏,这是一个只读的UIToolbar.我想使用UINavigationController's工具栏而不是仅仅创建一个子视图工具栏,因为我正在使用滑入式setToolbarHidden动画.

任何人都知道是否可以将背景图像应用于此UINavigationController工具栏(最有可能通过某种方式覆盖该drawRect方法)?

Mau*_*zio 10

更新:

在iOS 5.0+中,您现在可以使用UIAppearance自定义导航栏.


另一种方法是简单地为您的应用程序UINavigationBar类创建一个Category .实现起来非常简单:

接口:

@interface UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect;

@end
Run Code Online (Sandbox Code Playgroud)

执行:

@implementation UINavigationBar (TENavigationBar)

- (void) drawRect:(CGRect)rect
{
    UIImage *image = [UIImage imageNamed:@"navigation_background"];

    [image drawInRect:CGRectMake(0, 
                                 0, 
                                 self.frame.size.width, 
                                 self.frame.size.height)];
}

@end
Run Code Online (Sandbox Code Playgroud)

然后,这将自动全局应用于您UINavigationBar的所有人.


Ale*_*son 9

您需要子类而不是创建类别.

我不太清楚为什么一个类别适用于UINavigationBar但不是UIToolbar,但是子类化适用于它们两者,我认为这是更加标准的方式来定制这样的东西.

所以为了子类UIToolbar,创建一个名为MyToolbar(或类似的东西)的类并将其放在.h中:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface MyToolbar : UIToolbar {}

- (void)drawRect:(CGRect)rect;

@end
Run Code Online (Sandbox Code Playgroud)

这在.m文件中:

#import "MyToolbar.h"

@implementation MyToolbar

- (void)drawRect:(CGRect)rect {
    backgroundImage = [UIImage imageNamed:@"my-awesome-toolbar-image.png"];
    [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end
Run Code Online (Sandbox Code Playgroud)

从那里你必须告诉导航控制器使用MyToolbar而不是UIToolbar.我发现这样做的最简单方法是在Interface Builder中选择导航控制器,然后在属性检查器中选中"显示工具栏"框.工具栏应显示在NavigationController窗口中.单击它,然后在Identity Inspector中将类更改为MyToolbar.

  • 大!谢谢.您(或其他任何人)是否知道以编程方式执行最后一步的方法?我没有使用Interface Builder设置导航控制器. (3认同)
  • @Chris,我也想知道如何以编程方式覆盖工具栏.谢谢! (2认同)