定制UINavigationBar

在开发中经常需要定制某些界面,navigationController的navigationBar就是一个很典型的例子,比如要修改背景图、后退按钮等等。

背景图的修改很简单,但是需要了解iOS的框架,假设我给自己定制的UINavigationController增加一个接口用于修改背景图:

@property (nonatomic, retain) UIImage *backgroundImage;

那么该消息的实现如下:

-(void)setBackgroundImage:(UIImage *)backgroundImage{
    if ([self.navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) {
        [self.navigationBar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
        return;
    }
    self.navigationBar.layer.contents = (id)backgroundImage.CGImage;
}

iOS 5增加了大量API,可以基本满足我们的定制需求,所以如果是iOS 5,我们直接调5的API就行了,而最后一行代码是针对5以下的,也就是说这一行代码就可以修改了,写起来容易但是要知道为什么。众所周知一个视图如何显示是取决于它的drawRect方法,因为调这个方法之前iOS也不知道如何显示它,但其实drawRect方法的目的也是画图(显示内容),而且我们如果以其他的方式给出了内容(图)的话,drawRect方法就不会被调用了。

注:实际上UIView是CALayer的delegate,如果CALayer没有内容的话,会回调给UIView的displayLayer:或者drawLayer:inContext:方法,UIView在其中调用drawRect,draw完后的图会缓存起来,除非使用setNeedsDisplay或是一些必要情况,否则都是使用缓存的图。

虽然往navigationBar里面插入一个imageView也能达到这种目的,但是要麻烦得多,因为你要自己管理navigationBar的视图层级,原因在于iOS 4和iOS 5的版本不同,往navigationBar插入视图的位置是相反的,不处理的话会导致部份子视图被遮住。

-----------------------------------------猥琐的分界线-----------------------------------------

如果只想更改后退按钮的标准属性,比如title、target、action,那么就:

    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] init];
    backButtonItem.title = @"已改的";
    backButtonItem.target = self;
    backButtonItem.action = @selector(back);
    self.navigationItem.backBarButtonItem = backButtonItem;
    [backButtonItem release];

只要注意一点,这个设置是针对于子导航层级的,也就是你push到下个视图控制器的时候才会看到。

如果是想更改字体、颜色、背景之类的,就要用到UIButton了:

    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
    [back setTitle:@"已改" forState:UIControlStateNormal];
    [back setFrame:CGRectMake(0, 0, 100, 32)];
    [back setBackgroundColor:[UIColor redColor]];
    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:back];
    self.navigationItem.leftBarButtonItem = backButtonItem;
    [backButtonItem release];

完全当成一个button来用,注意和上面的不同:赋给了leftBarButtonItem。

如果你不知道何时添加这个自己的后退按钮?很简单,判断navigationBar.backItem有没有就行了,跟着系统走是不会错的,不过可能要再判断一下当前显示的viewController有没有用到leftBarButtonItem,不要覆盖掉逻辑就行了。

-----------------------------------------如有问题,请指出-----------------------------------------

时间: 2025-01-21 12:57:04

定制UINavigationBar的相关文章

ios编程:iPhone How-to:给导航栏贴图

通过tintColor属性可以定制UINavigationBar的背景颜色,但如果需要设定渐变色.甚至纹理来说,就需要贴图了.比较"暴力"的一种做法就是通过Category来重新实现- (void) drawRect:(CGRect)rect的实现,"暴力"是因为这种杀伤面很广,所有项目内的UINavigationBar都会因此改变.这点在应用中应该格外小心. @interface UINavigationBar (ImageBackground) @end @im

如何设计一个 iOS 控件?(iOS 控件完全解析)

代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内:而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常特征之间需要做一些取舍,比如灵活性与耦合度,有时候接口越多越能适应各种环境,但是接口越少对外产生的依赖就越少,维护起来也更容易.通常一些前期看起来

iOS中的导航栏UINavigationBar与工具栏UIToolBar要点解析_IOS

一.导航栏UINavigationBar 1.导航栏的使用 在iOS开发中,我们通常会使用导航控制器,导航控制器中封装了一个UINavigationBar,实际上,我们也可以在不使用导航控制器的前提下,单独使用导航栏,在UINavigationBar中,也有许多我们可以定制的属性,用起来十分方便. 2.UINavigationBar的创建和风格类型 导航栏继承于UIView,所以我们可以像创建普通视图那样创建导航栏,比如我们创建一个高度为80的导航栏,将其放在ViewController的头部,

android webview定制contextmenu

问题描述 android webview定制contextmenu 10C 如何实现图种的webview的上下文菜单.需求是获取选中的内容,进行操作. 解决方案 http://www.2cto.com/kf/201310/248762.html 解决方案二: android的ContextMenuAndroid ContextMenuandroid ContextMenu 解决方案三: webview里的问题是可以实现你说的功能,不需要单独设置. 解决方案四: 你把属性设置对就不会错了 解决方案

视频出炉:4月15日《阿里云RDS MySQL分支深度定制实战分享》

活动视频 <阿里云RDS MySQL分支深度定制实战分享> PDF地址:https://oss.aliyuncs.com/yqfiles/a5344b5961b367786a95620c636c4640.pdf 分享简介:阿里云RDS MySQL经过多年的积累,不断的进行性能优化,并定制了适合不同行业需求的功能,同时也向官方和社区贡献力量.本次主题主要介绍RDS MySQL分支的深度定制,包括功能扩展.资源管控.性能优化.数据安全.行业解决方案等. 分享者:赵建伟,现任阿里云数据库内核资深研发

定制UITabBar显示样式

定制UITabBar显示样式   思路是这样子的: 1. 初始化UITabBarController,并装载进来几个其他的ViewController 2. 获取每个控制器的UITabBarItem 3. 单独配置每个ViewController对应的UITabBarItem(其中,文字可以设置偏移量) 就这么简单哦!       问:如何设置UITabBarController高亮选中的颜色值呢?   问:[UITabBar appearance]能干什么? 他是进行UITabBarContr

随着HTML5的普及,定制化的移动CRM应用时代即将到来

 近年来,移动CRM应用异常火爆,大多为原生APP形式,且大部分产品不支持定制.对于很多用户来讲,已经不再满足于只是有一个移动端CRM了,更希望用上根据自身业务流程定制的移动CRM.     在移动端,用原生APP进行这样的纯个性化定制的成本是很高的.但使用HTML5就变得很容易了,HTML5的特点是跨平台.跨设备一次开发,多处使用,用户无需下载,瞬间打开,用户无需升级,永远最新,无需经过应用商店发布.     当然,HTML5也有它的局限性,比如,使用CSS样式或者CSS动画的用户体验无法与原

dijit样式定制之TextBox(一)

参考资料:http://dojotoolkit.org/reference-guide/1.9/dijit/themes.html http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/themes/themeTester.html http://www.lesscss.net/article/home.html 这系列博客主要因为工作中经常需要更改dijit样式,每次都需要看dijit的DOM结构来更改,好多次都是改了一个class样

ABC定制视图导航控制器

ABCustomUINavigationController  ABC定制视图导航控制器   Subclass of UINavigationController for overwriting push and pop methods to create new transitions effects. Currently it has been implemented two transition animations:继承至 UINavigationController (UI导航控制器)