http://blog.k-res.net/archives/1585.html
在做
ViewControlller
的
navigationItem
时,我们经常需要使用
自定义
的图片来替换系统默认的按钮样式,这点在对普通导航项,比如
leftBarButtonItem
或
rightBarButtonItem
来说还是比较简单的,通过
UIBarButtonItem
的
setImage
设置做好的图片按钮,然后再通过
1
|
[item setBackgroundImage:[UIImage
new
] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
|
去掉默认的背景
p_w_picpath
就可以了。但是如果是想
自定义
特殊的
backBarButtonItem
就比较麻烦了,直接使用和普通
item
一样的方法,会发现根本没有效果,这是因为就算同为
UIBarButtonItem
,
back
方式的处理也是和一般的不一样的,
api
里专门提供了一套
setBackButtonXXX
的
api
,如
setBackButtonBackgroundImage
来提供给
UIBarButtonItem
用作
back button
时的参数设置,虽然也有
setBackButtonBackgroundImage
可以用,但是替换完会发现图片被以局部拉伸平铺的方式适应了按钮的大小,这样如果你的图片按钮可以这么做,比如和默认效果累死,只是换个颜色,换个边框,或者甚至是也支持这种局部拉伸平铺的做法,就还好说,调整一下拉伸范围参数就可以了,但是如果是固定图形,不像自适应拉伸的话就比较麻烦了,本人试了几种操作组合,发现不是需要去掉
button title
就是背景重叠,各种效果不对。这时看到有人说
自定义
backBarButtonItem
确实比较麻烦,建议可以以
hide
的方式隐藏默认返回按钮,同时配合
leftBarButtonItem
样式和自定义响应函数中调用
navigation
的
pop
来实现类似效果,这种方法虽然确实可行,但是总感觉有默认的行为(而且当前页的
back
实际是显示在导航切换到的下一页上的,直接替换还要考虑这点!)不用而自己模拟替代这样不是很妥,于是又查找了一些资料,终于找到了可以在不缩放图片,不去掉
title
的前提下,替换
backBarButton
图片的方法:
1
|
UIImage* p_w_picpath = [UIImage p_w_picpathNamed:
@"back_button.png"
];
|
2
|
[item setBackButtonBackgroundImage:[p_w_picpath resizableImageWithCapInsets:UIEdgeInsetsMake(0, p_w_picpath.size.width, 0, 0)] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
|
3
|
[item setBackButtonTitlePositionAdjustment:UIOffsetMake(-400.f, 0) forBarMetrics:UIBarMetricsDefault];
|
4
|
self
.navigationItem.backBarButtonItem = item;
|
原理很简单,第一行加载图片,第二行以加载图片的宽度结合
resizableImageWithCapInsets
生成一个缩放时不会拉伸的新图片作为
BackButtonBackgroundImage
,再在第三行设置
title
的位置偏移到一个不可见的位置,达到隐藏的目的。另外,如果需要全部统一替换,也可以在
app
的
didFinishLaunching
里通
[UIBarButtonItem appearance]
全部统一替换
!