IOS开发(五):分段控件UISegmentedControl
分段控件常用于在不同类别的信息之间选择,或者在不同的应用程序屏幕之间切换;
如果在一系列值中选择时不会立刻发生视觉方面的变化,应使用选择器(Picker)对象;
建议使用分段控件来更新视图中显示的信息,但是如果这种更新意味着修改屏幕上的一切,则最好使用工具栏或选项卡(Tab Bar)在多个彼此独立的视图之间切换。
使用概括:
1)、分段控件和开关很像,也是通过监视Value Changed事件,并通过、selectedSegmentIndex判断当前选择的按钮,它返回当前选定按钮的编号(从0开始、从左到右);
2)、结合使用索引和实例方法、titleForSegmentAtIndex来获得每个分段的标题,例如:
[mSegment titleForSegmentAtIndex: mSegment.selectedSegmentIndex];
一、分段控件的属性和方法
例如设置指定索引的题目,设置指定索引的图片,在指定索引插入一个选项并设置图片,在指定索引插入一个选项并设置题目,移除指定索引的选项,设置指定索引选项的宽度,获取指定索引选项的图片/标题,获取总选项数,获取指定索引选项的宽度,设置样式等等。
二、使用分段控件
运行效果如图所示:
.m文件代码:
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UISegmentedControl *mSegmentedControl = [[UISegmentedControl alloc] initWithItems:nil]; mSegmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; UIColor *mTint = [[UIColor alloc] initWithRed:0.66 green:1.0 blue:(0.77) alpha:1.0]; mSegmentedControl.tintColor = mTint; mSegmentedControl.momentary = YES; //这里的atIndex设置为3为什么不会出错? [mSegmentedControl insertSegmentWithTitle:@"First" atIndex:(0) animated:YES]; [mSegmentedControl insertSegmentWithTitle:@"Second" atIndex:(3) animated:(YES)]; [mSegmentedControl insertSegmentWithTitle:@"Third" atIndex:(5) animated:(YES)]; //设置标题,覆盖原来的标题,这里会越界 [mSegmentedControl setTitle:@"ZERO" forSegmentAtIndex:(0)]; //读取标题,这里也会越界 NSString *mTitle = [mSegmentedControl titleForSegmentAtIndex:(0)]; NSLog(@"myTitle:%@",mTitle); //设置Item的宽度,这里也会越界 [mSegmentedControl setWidth:(100) forSegmentAtIndex:(0)]; [mSegmentedControl setWidth:(100) forSegmentAtIndex:(1)]; //这里@selector()括号里面的函数名,一开始在下面定义的函数名和括号里面的不一样,没想到编译没有报错,而是运 //行点击的时候,才会报错。。。 [mSegmentedControl addTarget:(self) action:(@selector(selected:)) forControlEvents:(UIControlEventValueChanged)]; //添加到父视图 [self.view addSubview:mSegmentedControl]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - selected -(void)selected:(id)sender{ UISegmentedControl *control = (UISegmentedControl *)sender; switch (control.selectedSegmentIndex){ case 0: // //NSLog(@"AA"); break; case 1: // break; case 2: // break; default: break; } } @end
三、说明
1、#pragma mark -
从技术上讲,以 #pragma 开头的代码是一条编译器指令,是一个特定于程序或编译器的指令。它们不一定适用于其它编译器或其它环境。如果编译器不能识别该指令,则会将其忽略。
它们告诉Xcode编译器,要在编辑器窗格顶部的方法和函数弹出菜单中将代码分隔开,如下图所示:
一些类(尤其是一些控制器类)可能很长,方法和函数弹出菜单可以便于代码导航。此时加入#pragma 指令对代码进行逻辑组织很有效果。
注意:
1)、#pragma mark – 的“-”后面不能有空格;
//(这个不能有空格不知道具体什么意思,我加了空格,貌似也有用。)
2)、如果你的标志没有出现在弹出菜单中,比如没有分隔线出现,请在Xcode菜单 “Preferences..”中的 “Code Sense”选项取消选中”Sort list alphabetically”即可。
2、选中分段控件
分段控件的默认行为是,一旦按钮被选中就一直保持,直到另外一个按钮被选中为止。可以改变这种默认的行为,变成按钮按下后很快就自动释放,将控件的momentary属性设为YES:
mSegmentedControl.momentary = YES;
初始化默认片段
默认情况下,除非你指定,否则不会有任何片段被选中。要设置 selectedSegmentedIndex 属性:
mSegmentedControl.selectedSegmentedIndex = 0;
3、添加事件
要接收片段选取的通知,可以用UIControl类的 addTarget 方法,为 UIControlEventValueChanged 事件添加一个动作:
[mSegmentedControl addTarget:self action:@selector(selected:) forControlEvents:UIControlEventValueChanged];
这样只要选中了一个片段,添加的该事件(selected:方法)就会被触发。
4、分段控件的样式
typedef enum { UISegmentedControlStylePlain, // large plain 有灰边的大白按钮,适合偏好设置单元 UISegmentedControlStyleBordered, // large bordered 黑边的大白按钮,适用于表格单元 UISegmentedControlStyleBar, // small button/nav bar style. tintable 小按钮,适合导航栏 UISegmentedControlStyleBezeled, // large bezeled style. tintable } UISegmentedControlStyle;
1)、StylePlain:
2)、StyleBordered:
3)、StyleBar:
如果使用UISegmentedControlStyleBar风格,可以用tintColor属性为整个控件设置渲染色彩。
UIColor *mTint = [[ UIColor alloc]initWithRed:0.66 green:1.0 blue:0.77 alpha:1.0]; mySegmentedControl.tintColor = mTint;
4)、StyleBezeled:
不过使用StyleBezeled的时候,会提示过时的:
四、在storyBoard上面添加
拖动一个UISegmentedControl到布局上面,可以看到有个属性segments,默认是2段。
点击片段,可以修改上面显示的文字。