3.6 按钮项目

3.6.1 系统按钮

可以在导航条、工具条中追加各种各样的UIBarButtonItem(注意UIBarButtonItem为UIBarItem的子类,而与UIView没有继承关系),UIKit中事先提供了各种系统按钮。创建系统按钮时,使用UIBarButtonItem的initWithBarButtonSystemIt em:target:action:方法。以下是具体的实例代码。

UIBarButtonItem* button =
     [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarBut tonSystemItemUndo
                  target:self
                 action:@selector(buttonDidPush)] autorelease];

上述代码中,首先向其第一个参数中传入常量UIBarButtonSystemItemUndo,此按钮为刷新画面专用的系统按钮。如图3-23所示。

图3-23 刷新按钮

接着向target中传入self,向action中传入@selector(buttonDidPush)后,当用户触摸此系统按钮时,将调用本类中定义的 buttonDidPush 方法。使用initWithBarButtonS ystemItem:target:action:方法,可以追加各种系统按钮,当用户触摸时执行各种对应的处理。表3-3中罗列了全部系统按钮。

表3-3 系统按钮列表

续表

3.6.2 工具条按钮间距的调整

表3-3中罗列了所有的系统按钮,实际UIKit中还提供了两个没有出现在表中的常量。分别是UIBarButtonSystemItemFlexibleSpace以及UIBarButtonSystemItem FixedSpace。这些也是UIBarButtonSystemItem类型常量,但是不是按钮,而是调整按钮间距用的对象。例如,如果没有进行任何处理,依次追加4个按钮后,按钮将显示在工具条左侧,如图3-24所示。

图3-24 左对齐的工具条按钮

如果要让4个按钮等间距地分布在工具条中,在使用UIViewController的setToolbarItems:方法追加按钮时,如下述代码一样在4个按钮之间追加UIBarButtonSys temItemFlexibleSpace对象即可。

[self setToolbarItems:[NSArray arrayWithObjects:
              [self barButtonSystemItem:UIBarButtonSystemItemAction]
// 追加间距对象UIBarButtonSystemItemFlexibleSpace
               [self barButtonSystemItem:UIBarButtonSystemItemFlexi bleSpace]
               [self barButtonSystemItem:UIBarButtonSystemItemBookmarks]
// 追加间距对象UIBarButtonSystemItemFlexibleSpace
               [self barButtonSystemItem:UIBarButtonSystemItemFlexi bleSpace]
               [self barButtonSystemItem:UIBarButtonSystemItemReply]
// 追加间距对象UIBarButtonSystemItemFlexibleSpace
               [self barButtonSystemItem:UIBarButtonSystemItemFlexi bleSpace]
               [self barButtonSystemItem:UIBarButtonSystemItemCompose]
               nil]];

这里为了让代码看起来更整齐,创建了一个新方法barButtonSystemItem:,只需要向此方法中传入系统按钮的常量就可以创建对应的系统按钮了,相关代码如下。

-(UIBarButtonItem*)barButtonSystemItem:(UIBarButtonSystemItem)systemItem {
  UIBarButtonItem* button =
    [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItem
                                target:nil
                                action:nil] autorelease];
  return button;
}

执行后,将显示如图3-25所示的效果。

图3-25 等间距按钮

如上述实例所示,UIBarButtonSystemItemFlexibleSpace能自动调节按钮间的间距。

另外,不仅可以调整按钮间的间距,将其配置到左端(传递给setToolbarItems:方法的数组的第一个元素)时,可创建靠右的工具条按钮(见图3-26)。同时配置到左右端(数组的第一项及最后一项)时,将创建居中的工具条按钮(见图3-27)。

图3-26 靠右的工具条按钮

图3-27 居中的工具条按钮

如果不想自动调整按钮间的间距,而是指定固定间距值时,使用UIBarButton SystemItemFixedSpace。通过指定 UIBarButtonSystemItemFixedSpace 创建UIBarButtonItem实例,然后通过width属性指定宽度。以下是实例代码。

// 指定 UIBarButtonSystemItemFixedSpace 创建UIBarButtonItem实例
UIBarButtonItem*fixedSpace = [self barButtonSystemItem:UIBarButton SystemItemFixedSpace];
// 将宽度固定为35个像素
fixedSpace.width = 35;
// 以35个像素取代其中一个按钮
  [self setToolbarItems:[NSArray arrayWithObjects:
  [self barButtonSystemItem:UIBarButtonSystemItemAction],
  [self barButtonSystemItem:UIBarButtonSystemItemFlexibleSpace],
  [self barButtonSystemItem:UIBarButtonSystemItemBookmarks],
  [self barButtonSystemItem:UIBarButtonSystemItemFlexibleSpace],
     fixedSpace,
    [self barButtonSystemItem:UIBarButtonSystemItemFlexibleSpace],
    [self barButtonSystemItem:UIBarButtonSystemItemCompose],
    nil]];

代码执行后,显示如图3-28所示的效果。UIBarButtonSystemItemFixedSpace 主要用于有特定按钮显示/隐藏间切换需要的场合,通过它当按钮隐藏时不至于破坏工具条的外观。

图3-28 固定间隔的使用效果

3.6.3 定制按钮

上一小节介绍了UIKit中提供的系统按钮,导航条以及工具条中还可以追加自定义按钮,如图3-29所示。

图3-29 自定义按钮

首先,可以使用initWithTitle:style:target:action:方法创建文本按钮,另外还可以使用initWithImage:style:target:action:方法创建图标按钮。图3-30、图3-31分别是文本按钮以及图标按钮。

图3-30 文本按钮

图3-31 图标按钮

指定图标图片创建按钮时,请注意图片将被变换为单色。原理与标签条图标相同(请参照第3.3.3节)。以下是具体的实例代码。

// 创建文本按钮
UIBarButtonItem*button = [[[UIBarButtonItem alloc] initWithTitle:@"Plain"
                     style:style
                     target:nil
                     action:nil] autorelease];
// 创建图标图片按钮
UIImage*image = [UIImage imageNamed:@"smile.png"];
UIBarButtonItem*icon = [[[UIBarButtonItem alloc] initWithImage:image
style:UIBarButtonItemStylePlain
                     target:self
                     action:@selector(buttonDidPush:)] autorelease];

上述两种方法中,target与action上面已经介绍过,与事件响应有关。通过在style中指定不同的常量,可以改变按钮的外观。表3-4中罗列了常量值及其显示的外观区别。

表3-4 style中可指定的常量列表

其次,UIBarButtonItem中不仅可以使用文本以及图标图片创建,还可以使用任意UIView的子类进行创建(见图3-32)。

图3-32 定制按钮

有不适合创建定制按钮的类,下列为适合创建定制按钮的代表类。

  • UIImageView。
  • UISwitch。
  • UISegmentedControl。

下面首先分别创建3种类的实例,然后作为参数传递到initWithCustomView:方法中,完成定制按钮的创建。代码如下。

// 在导航条中追加UIImageView
UIImage* image = [UIImage imageNamed:@"face.jpg"];
UIImageView*imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
UIBarButtonItem* icon =
    [[[UIBarButtonItem alloc] initWithCustomView:imageView] autorelease];
self.navigationItem.rightBarButtonItem = icon;
// 向工具条中追加UISwitch
UISwitch*theSwitch = [[[UISwitch alloc] init] autorelease];
theSwitch.on = YES;
UIBarButtonItem* switchBarButton =
    [[[UIBarButtonItem alloc] initWithCustomView:theSwitch] autorelease];
// 向工具条中追加UISegmentedControl
NSArray*segments = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
UISegmentedControl* segmentedControl =
    [[[UISegmentedControl alloc] initWithItems:segments] autorelease];
segmentedControl.selectedSegmentIndex = 1;
segmentedControl.frame = CGRectMake(0,0,100,30);
UIBarButtonItem*segmentedBarButton =
   [[[UIBarButtonItem alloc] initWithCustomView:segmentedControl] autorelease];
[self setToolbarItems:[NSArray arrayWithObjects:
        switchBarButton,
        segmentedBarButton,
        nil]];

代码执行后效果如图3-32所示,分别在导航条中追加了UIImageView的按钮,在工具条中追加了UISwitch以及UISegmentedControl按钮。