返回按钮定制方法之比较

若是你想在导航栏/工具栏定制一个带左箭头的Bar Button Item,那么有三种可能的方法:ide

q用png图片定制Bar Button Item ;工具

q用png图片定制Button ,而后addSubviews至导航栏/工具栏。spa

q使用私有API按钮类型101,而后addSubviews至导航栏/工具栏;.net

如今比较三种方法之异同:orm

1、第1种方法:用png图片定制BarButton Item图片

    UIBarButtonItem* buttonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"backbutton_alpha.png"]get

                                                                  style:UIBarButtonItemStylePlainit

                                                                 target:selfio

                                                                 action:@selector(goBackAction)];select

   

   

    toolbar.items = [NSArray arrayWithObjects:buttonItem,nil];

   

这种方法须要为BarButtonItem准备一张mask图片backbutton_alpha.png。backbutton_alpha.png图片将做为BarButtonItemd的mask(遮罩)图片,与tintcolor一块儿产生一张背景图片。你不能用通常的png图片,不然按钮会呈现一个实心的方块。通常的png图片,须要经过photoshop等进行处理。好比backbutton_alpha.png其实是由backbutton_blue.png图片通过‘mask to alpha ’处理获得的。结果处理后的backbutton_alpha.png,只保留了原图的alpha通道信息。

这种方法的好处在于,BarButtonItem的颜色是根据工具栏/导航栏的tintcolor而变的。如上图的第1个按钮,无论工具栏/导航栏的tintcolor作何调整,BarButtonItem的颜色会随之调整,你不须要准备新的图片。缺点是,BarButtonItem不会保留原图的效果(由于颜色信息丢失),它的颜色会比其余两种方法制做的要浅些。

2、第2种方法:用png图片定制Button ,而后addSubviews至导航栏/工具栏

    //导航按钮"返回"=======

    UIButton* btn = [UIButtonbuttonWithType:UIButtonTypeCustom];

btn.frame = CGRectMake(80, 8, 47, 28);

[btnsetImage:[UIImageimageNamed:@"backbutton_green.png"forState:UIControlStateNormal];

[btnaddTargetselfaction@selector(goBackAction) forControlEventsUIControlEventTouchUpInside];

[toolbaraddSubview: btn];

 

这种方法制做的按钮见上图的第二个按钮。如代码所示,放在工具栏/导航栏上的按钮实际上已经不是BarButtonItem了,而是一个custom button。所以须要为它准备一张png位图。若是工具栏/导航栏的tintcolor发生改变,按钮的颜色样式仍然会是原来的样子,而不会自行调整。因此当工具栏/导航栏的tintcolor发生变化,你须要及时更换custom button的背景图片。优势是,因为使用的是位图,这个按钮能够显示得很是个性和真实。

   

3、 第3种方法:使用私有API按钮类型101,而后addSubviews至导航栏/工具栏

    UIButton* button = [UIButton buttonWithType:101];// left-pointing shape!

    [button addTarget:self action:@selector(goBackAction)forControlEvents:UIControlEventTouchUpInside];

    [button setTitle:@"返回1111" forState:UIControlStateNormal];

    button.frame = CGRectMake(140, 7, 87, 28);

[toolbar addSubview: button];

 

第3种方法本质上仍然同第2种方法,是UIButton的定制而不是BarButtonItem的定制, 如上图第3个按钮所示。

苹果的UIButtonType并不单单是API中申明的5个枚举值。超过100的UIButtonType将显示一些特殊的按钮。好比101就是一个backButton样式的导航按钮,110则指定各类tintcolor的水晶按钮。可是这些undocumented的UIButtonType属于苹果“私有API”,可能在新的iOS版本中得不到支持。

但这种方法的好处在于,你不须要让美工为你制做专门的按钮图片。并且它的标题是能够设置的(图片则不行,一旦制做好就不能更改),当文字内容较多时,你还能够指定按钮的frame大小,让按钮大小天然改变,以容纳更多标题文本。

遗憾的是,这种方法没法让按钮颜色根据工具栏/导航栏的tintcolor进行调整。UIButton仍然有tintcolor属性,但一旦你修改UIButton的tintcolor属性,按钮就会失去原有的样式,变成一个Round Rect  Button。因此你只能以默认的颜色(蓝色)使用这种类型的按钮(UIButtonType=101)。

4、 结论

尽可能采用第2种方法。

demo位于:http://download.csdn.net/detail/kmyhy/4902209。

相关文章
相关标签/搜索