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:方法来设置的。