UISegmentControl分段控制器是UIKit框架提供的一組按鈕欄抖坪,提供多個(gè)可選的按鈕填渠,只能激活其中的一個(gè)弦聂,響應(yīng)事件鸟辅。主要用來在同一層次重要性下不同的信息展示或者不同的界面展示之間切換。例如手機(jī)QQ的主界面的消息和電話兩個(gè)選項(xiàng)卡莺葫。
我們看一下UISegmentedControl的繼承結(jié)構(gòu):
UISegmentedControl-->UIControl-->UIView-->UIResponder-->NSObject
在iOS事件相關(guān)類中我們知道UIControl將觸摸事件轉(zhuǎn)換成了帶接收方的控件事件匪凉,它本身是個(gè)抽象類,只能實(shí)例化它的子類來處理控件事件捺檬。UISegmentedControl繼承自UIControl,它具有所有UIControl的屬性和方法再层。
-
屬性
@property(nonatomic) UISegmentedControlStyle segmentedControlStyle NS_DEPRECATED_IOS(2_0, 7_0, "The segmentedControlStyle property no longer has any effect") __TVOS_PROHIBITED;
@property(nonatomic,getter=isMomentary) BOOL momentary; // if set, then we don't keep showing selected state after tracking ends. default is NO
@property(nonatomic,readonly) NSUInteger numberOfSegments;
@property(nonatomic) BOOL apportionsSegmentWidthsByContent NS_AVAILABLE_IOS(5_0);
@property(nonatomic) NSInteger selectedSegmentIndex;
@property(null_resettable,nonatomic,strong) UIColor *tintColor;
iOS7之后采用扁平化設(shè)計(jì)風(fēng)格,segmentedControlStyle被廢棄堡纬,設(shè)置了也沒有效果聂受。momentary設(shè)置點(diǎn)擊之后是否恢復(fù)原樣,默認(rèn)是NO烤镐。numberOfSegments表示選項(xiàng)卡的個(gè)數(shù)蛋济。apportionSegmentWidthsByContent默認(rèn)為NO,如果設(shè)置為YES炮叶,對(duì)于寬度為0的segment它將根據(jù)其內(nèi)容自動(dòng)調(diào)整segment的寬度碗旅。selectedSegmentIndex表示當(dāng)前選中的segment的索引。 tintColor描述View中線條輪廓的顏色镜悉,它默認(rèn)會(huì)一直從最底部的View向上層傳遞祟辟,直到某個(gè)子View修改了tintColor,傳遞鏈斷開,新的tintColor繼續(xù)向上層傳遞侣肄。更多關(guān)于tintColor
和backgroundColor
和foregroundColor
的區(qū)別參考iOS字體顏色圖片部分旧困。
-
對(duì)象方法
- (instancetype)initWithItems:(nullable NSArray *)items; // items can be NSStrings or UIImages. control is automatically sized to fit content
- (void)insertSegmentWithTitle:(nullable NSString *)title atIndex:(NSUInteger)segment animated:(BOOL)animated; // insert before segment number. 0..#segments. value pinned
- (void)insertSegmentWithImage:(nullable UIImage *)image atIndex:(NSUInteger)segment animated:(BOOL)animated;
- (void)removeSegmentAtIndex:(NSUInteger)segment animated:(BOOL)animated;
- (void)removeAllSegments;
- (void)setTitle:(nullable NSString *)title forSegmentAtIndex:(NSUInteger)segment; // can only have image or title, not both. must be 0..#segments - 1 (or ignored). default is nil
- (nullable NSString *)titleForSegmentAtIndex:(NSUInteger)segment;
- (void)setImage:(nullable UIImage *)image forSegmentAtIndex:(NSUInteger)segment; // can only have image or title, not both. must be 0..#segments - 1 (or ignored). default is nil
- (nullable UIImage *)imageForSegmentAtIndex:(NSUInteger)segment;
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment; // set to 0.0 width to autosize. default is 0.0
- (CGFloat)widthForSegmentAtIndex:(NSUInteger)segment;
- (void)setContentOffset:(CGSize)offset forSegmentAtIndex:(NSUInteger)segment; // adjust offset of image or text inside the segment. default is (0,0)
- (CGSize)contentOffsetForSegmentAtIndex:(NSUInteger)segment;
- (void)setEnabled:(BOOL)enabled forSegmentAtIndex:(NSUInteger)segment; // default is YES
- (BOOL)isEnabledForSegmentAtIndex:(NSUInteger)segment;
以上方法比較簡(jiǎn)單,根據(jù)方法名字就知道它的具體功能稼锅。需要注意的是initWithItems
的數(shù)組參數(shù)既可以是字符串也可以是圖片吼具,segmentedControl會(huì)根據(jù)文字或者圖片的寬高自動(dòng)設(shè)置自己的寬高。setContentOffset
設(shè)置圖片或者文字內(nèi)容相對(duì)于單個(gè)segment的坐標(biāo)原點(diǎn)也就是左上角的偏移量矩距,默認(rèn)是(0,0).更多關(guān)于offset,inset的內(nèi)容請(qǐng)參考iOS基本框架UIKit之幾何形狀setEnabled forSegmentAtIndex
用來設(shè)置指定的索引的segment能否被選中馍悟。
- (void)setBackgroundImage:(nullable UIImage *)backgroundImage forState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (nullable UIImage *)backgroundImageForState:(UIControlState)state barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (void)setDividerImage:(nullable UIImage *)dividerImage forLeftSegmentState:(UIControlState)leftState rightSegmentState:(UIControlState)rightState barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (nullable UIImage *)dividerImageForLeftSegmentState:(UIControlState)leftState rightSegmentState:(UIControlState)rightState barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (void)setTitleTextAttributes:(nullable NSDictionary *)attributes forState:(UIControlState)state NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (nullable NSDictionary *)titleTextAttributesForState:(UIControlState)state NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (void)setContentPositionAdjustment:(UIOffset)adjustment forSegmentType:(UISegmentedControlSegment)leftCenterRightOrAlone barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
- (UIOffset)contentPositionAdjustmentForSegmentType:(UISegmentedControlSegment)leftCenterRightOrAlone barMetrics:(UIBarMetrics)barMetrics NS_AVAILABLE_IOS(5_0) UI_APPEARANCE_SELECTOR;
setBackgroundImage
根據(jù)UIBarMetrics設(shè)置背景圖片,barMetrics用于表示在手機(jī)屏幕橫豎屏?xí)r對(duì)圖片進(jìn)行的拉伸和縮放以適應(yīng)segment寬高的變化。
setDividerImage
用于在你自定義SegmentControl的時(shí)候剩晴,必須設(shè)置左右兩個(gè)segment都未選擇時(shí)的分割圖片,和左邊選中右邊為選中時(shí)的分割圖片以及左邊未選中右邊選中時(shí)的分割圖片這3種侵状。
setTitleTextAttributes
通過NSAttributedString.h頭文件里面的UIKIT_EXTERN
修飾的函數(shù)來設(shè)置文字的屬性赞弥。更多關(guān)于UIKIT_EXTERN
宏定義的內(nèi)容參考iOS的宏定義
setContentPositionAdjustment
主要用來對(duì)一些不同的segment類型內(nèi)容通過offSet調(diào)整內(nèi)容位置。segmentType有以下幾種形式
typedef NS_ENUM(NSInteger, UISegmentedControlSegment) {
UISegmentedControlSegmentAny = 0,//帶便任何一個(gè)segment
UISegmentedControlSegmentLeft = 1, // 最左邊的segment,只有segment的個(gè)數(shù)大于1時(shí)才有效
UISegmentedControlSegmentCenter = 2, // 任何一個(gè)不是最左也不是最右的segment,只有當(dāng)segment的個(gè)數(shù)大于2的時(shí)候才有效
UISegmentedControlSegmentRight = 3, // 最右邊的segment,只有segment的個(gè)數(shù)大于1時(shí)才有效
UISegmentedControlSegmentAlone = 4, // 當(dāng)且僅當(dāng)segment的個(gè)數(shù)只有1個(gè)時(shí)才有效
};
下面是關(guān)于使用系統(tǒng)的UISegmentControl以及自定義SegmentControl(繼承系統(tǒng)UISegmentControl)的一個(gè)Demo