SegmentedControl又被称作分段控制器,是IOS开发中经常用到的一个UI控件。
1通常是在单视图中使用,不做多视图之间的切换。实现视图中不同显示的快速切换,每一个分割表示一个不同的显示,这些显示往往是相关的,所谓的相关,可以理解成,功能一样,但是属性类别有差异。
比较常用的还有比如说,在一个视图中,不同的分割控制tableView加载不同的数据源。
2 它通常在整个屏幕的上部,不是必然,但大部分情况下是这样用。
3 一般是3到5个分割,超过5个的话每个分割的大小对于用户触碰的体验会很差。
4 任意时刻,只有一个分割是激活状态的。有点像单选按钮。
- (void)initSegmentedControl
{
NSArray*segmentedData = [[NSArrayalloc]initWithObjects:@"apple",@"orange",@"banana",nil];
UISegmentedControl*segmentedControl = [[UISegmentedControlalloc]initWithItems:segmentedData];
segmentedControl.frame= CGRectMake(10.0,20.0,300.0,30.0);
/*
这个是设置按下按钮时的颜色
*/
segmentedControl.tintColor= [UIColorcolorWithRed:49.0/256.0green:148.0/256.0blue:208.0/256.0alpha:1];
segmentedControl.selectedSegmentIndex=0;//默认选中的按钮索引
/*
下面的代码实同正常状态和按下状态的属性控制,比如字体的大小和颜色等
*/
NSDictionary*attributes = [NSDictionarydictionaryWithObjectsAndKeys:[UIFontboldSystemFontOfSize:12],NSFontAttributeName,[UIColorredColor], NSForegroundColorAttributeName,nilnil];
[segmentedControlsetTitleTextAttributes:attributesforState:UIControlStateNormal];
NSDictionary*highlightedAttributes = [NSDictionarydictionaryWithObject:[UIColorredColor]forKey:NSForegroundColorAttributeName];
[segmentedControlsetTitleTextAttributes:highlightedAttributesforState:UIControlStateHighlighted];
//设置分段控件点击相应事件
[segmentedControladdTarget:selfaction:@selector(doSomethingInSegment:)forControlEvents:UIControlEventValueChanged];
[self.viewaddSubview:segmentedControl];
}
每个功能注释都有清晰的描述,有一点要特别说明一下:
在ios7以前,segmentedcontrol有一个segmentedControlStyle 属性,通常都要设置,比如像下面这样:
/*
typedef enum {
UISegmentedControlStylePlain,
UISegmentedControlStyleBordered,
UISegmentedControlStyleBar,
UISegmentedControlStyleBezeled,
} UISegmentedControlStyle;
*/
segmentedControl.segmentedControlStyle= UISegmentedControlStyleBar;
但是这个在ios7之后,出于扁平化风格的考虑,这些style都不在有效了
我们再写一个按钮的事件响应函数,设置不同的背景图片,如下:
-(void)doSomethingInSegment:(UISegmentedControl*)Seg
{
NSInteger Index = Seg.selectedSegmentIndex;
switch(Index)
{
case0:
self.view.backgroundColor= [UIColorcolorWithPatternImage:[UIImageimageNamed:kSrcName(@"bg_apple_small.png")]];
break;
case1:
self.view.backgroundColor= [UIColorcolorWithPatternImage:[UIImageimageNamed:kSrcName(@"bg_orange_small.png")]];
break;
case2:
self.view.backgroundColor= [UIColorcolorWithPatternImage:[UIImageimageNamed:kSrcName(@"bg_banana_small.png")]];
break;
default:
break;
}
}
设置是否保持选中状态:
@property(nonatomic,getter=isMomentary) BOOL momentary;
注意:如果设置为YES,点击结束后,将不保持选中状态,默认为NO
获取标签个数:(只读)
@property(nonatomic,readonly) NSUInteger numberOfSegments;
设置标签宽度是否随内容自适应:
@property(nonatomic) BOOL apportionsSegmentWidthsByContent;
注意:如果设置为NO,则所有标签宽度一致,为最大宽度。
插入文字标签在index位置:
- (void)insertSegmentWithTitle:(NSString *)title atIndex:(NSUInteger)segment animated:(BOOL)animated
插入图片标签在index位置
- (void)insertSegmentWithImage:(UIImage *)image atIndex:(NSUInteger)segment animated:(BOOL)animated
根据索引删除标签
- (void)removeSegmentAtIndex:(NSUInteger)segment animated:(BOOL)animated;
删除所有标签
- (void)removeAllSegments;
重设标签标题
- (void)setTitle:(NSString *)title forSegmentAtIndex:(NSUInteger)segment;
获取标签标题
- (NSString *)titleForSegmentAtIndex:(NSUInteger)segment;
设置标签图片
- (void)setImage:(UIImage *)image forSegmentAtIndex:(NSUInteger)segment;
获取标签图片
- (UIImage *)imageForSegmentAtIndex:(NSUInteger)segment;
注意:标题的图片只能设置一个
根据索引设置相应标签宽度
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;
注意:如果设置为0.0,则为自适应,默认为此设置。
根据索引获取标签宽度
- (CGFloat)widthForSegmentAtIndex:(NSUInteger)segment;
设置标签内容的偏移量
- (void)setContentOffset:(CGSize)offset forSegmentAtIndex:(NSUInteger)segment;
注意:这个偏移量指的是标签的文字或者图片
根据索引获取变标签内容的偏移量
- (CGSize)contentOffsetForSegmentAtIndex:(NSUInteger)segment;
根据所以设置标签是否有效(默认有效)
- (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment;
根据索引获取当前标签是否有效
- (BOOL)isEnabledForSegmentAtIndex:(NSUInteger)segment;
设置和获取当前选中的标签索引
@property(nonatomic) NSInteger selectedSegmentIndex;
设置标签风格颜色
@property(nonatomic,retain) UIColor *tintColor;
注意:这个风格颜色会影响标签的文字和图片
设置特定状态下segment的背景图案
- (void)setBackgroundImage:(UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
获取背景图案
- (UIImage *)backgroundImageForState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics
设置标签之间分割线的图案
-
(void)setDividerImage:(UIImage *)dividerImage
forLeftSegmentState:(UIControlState)leftState
rightSegmentState:(UIControlState)rightState
barMetrics:(UIBarMetrics)barMetrics
获取标签之间分割线的图案
-
(UIImage *)dividerImageForLeftSegmentState:(UIControlState)leftState
rightSegmentState:(UIControlState)rightState
barMetrics:(UIBarMetrics)barMetrics
通过Attribute字符串属性字典设置标签标题
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state
获取Attribute字符串属性字典
- (NSDictionary *)titleTextAttributesForState:(UIControlState)state
自行设置标签内容的偏移量
- (void)setContentPositionAdjustment:(UIOffset)adjustment forSegmentType:(UISegmentedControlSegment)leftCenterRightOrAlone barMetrics:(UIBarMetrics)barMetrics
注意:UIOffset为偏移量,这个结构体中又两个浮点数,分别表示水平量和竖直量;UISegmentedControlSegment类型参数是一个枚举
获取自定义偏移量
-(UIOffset)contentPositionAdjustmentForSegmentType:(UISegmentedControlSegment)leftCenterRightOrAlone
barMetrics:(UIBarMetrics)barMetrics
添加点击事件
[segmentedControl addTarget:self action:@selector(change:) forControlEvents:UIControlEventValueChanged];