2.8 分段控制器——UISegmentedControl

UISegmentedControl用于管理和实现一组内容的切换逻辑,例如几个并列关系的界面之间相互切换。UISegmentedControl常见于导航栏的标题视图中,因其小巧的外表和简洁的接口风格,在原生和第三方应用中都十分常见。

2.8.1 UISegmentControl基本属性的应用

首先使用Xcode 创建一个名为UISegmentedControlTest 的工程,在ViewController.m 的viewDidLoad方法中添加如下代码:

        - (void)viewDidLoad {
            [super viewDidLoad];
            UISegmentedControl * seg = [[UISegmentedControl alloc]initWithItems:@
    [@"one", @"", @"three", @"four"]];
            seg.frame = CGRectMake(20, 100, 280, 30);
            [seg setImage:[[UIImage imageNamed:@"image"] imageWithRenderingMode:U
    IImageRenderingModeAlwaysOriginal] forSegmentAtIndex:1];
            [seg setContentOffset:CGSizeMake(10, 10) forSegmentAtIndex:0];
            seg.momentary=NO;
            [self.view addSubview:seg];
        }

代码中使用initWithItems:方法来初始化UISegmentedControl 对象,这个方法中需要传入一个标题数组,数组中字符串的个数和内容决定了UISegmentControl 中按钮的个数和标题。setImage:forSegmentAtIndex:方法用于设置某个按钮的图案,其中按钮的Index 从0开始计。setContentOffset:forSegmentAtIndex:方法设置其中某个按钮内容的位置偏移。UISegmentedControl的momentary属性默认为NO,控件为切换按钮模式,如果设置为YES,则控件为触发按钮模式。运行工程,效果如图2-28所示。

图2-28 UISegmentedControl

提示

UISegmenedControl 在切换按钮模式时,当用户点击一个按钮后,此按钮会一直保持选中状态直到用户切换为另一个为止,而在触发按钮模式中,用户手指离开屏幕后,按钮将不保持选中状态。

2.8.2 对UISegmentedControl中的按钮进行增、删、改操作

UIsegmentedControl对象中的按钮除了在初始化时可以进行创建外,在程序运行过程中,也可以进行动态的添加、删除和修改操作,UISegmentedControl中有如下方法可供开发者使用。

        [seg insertSegmentWithTitle:@"new" atIndex:2 animated:YES];
        [seg removeSegmentAtIndex:1 animated:YES];
        [seg setTitle:@"replace" forSegmentAtIndex:1];
        [seg removeAllSegments];

insertSegmentWithTitle:atIndex:animated:方法用于在UISegmentedControl当前按钮数量的前提下插入一个新的标题按钮,第1个参数是设置按钮的标题文字,第2个参数是设置插入的位置,第3个参数是设置是否带动画效果,与这个方法对应的还有一个:insertSegmentWithImage:atIndex:animated:方法用于插入一个图片按钮。removeSegmentAtIndex:animated:方法可以在已有的按钮中移除一个。setTitle:forSegmentAtIndex:方法可以重新设置一个按钮的标题,与之对应的setImage:forSegmentIndex:方法可以重新设置一个按钮的图片。removeAllSegments方法将移除所有的按钮。

2.8.3 UISegmentedControl中按钮宽度的自适应

UISegmentedControl控件其中的按钮宽度默认是平均分的,如果某个按钮的标题长度超出了宽度的范围,将会被自动截断,如图2-29所示。

图2-29 UISegmentedControl按钮标题文字被截断

开发者可以手动对UISegmentedControl 中的每个按钮的宽度进行设置,以便设置按钮宽度与其文字相适应,示例代码如下,效果如图2-30所示。

图2-30 自定义UISegmentedContrl按钮宽度

        [seg setWidth:130 forSegmentAtIndex:3];

上面的方法可以做到UISegmentedControl 中按钮宽度的设置,但是有一个致命的缺点,开发者或者并不知道这个按钮上面标题文字所占的宽度,如果使用强制计算的方法,又会徒增许多的代码量。幸运的是,UISegmentedControl 中还提供了一个属性,可以让UISegmentedControl自己计算其中按钮需要的宽度,让其进行宽度的自适应,代码如下所示:

        seg.apportionsSegmentWidthsByContent=YES;

将apportionsSegmentWidthsByContent属性设置为YES,则UISegmentedControl控件中的按钮宽度将进行自适应。

提示

UISegmentedControl添加触发方法也是通过addTarget:action:forControlEvents:方法来设置的。