iOS控件之UISegmentedControl

UISegmentControl分段控制器是UIKit框架提供的一組按鈕欄,提供多個可選的按鈕,只能激活其中的一個,響應事件。主要用來在同一層次重要性下不同的信息展示或者不同的界面展示之間切換。例如手機QQ的主界面的消息和電話兩個選項卡。


qq.png

我們看一下UISegmentedControl的繼承結構:

UISegmentedControl-->UIControl-->UIView-->UIResponder-->NSObject

iOS事件相關類中我們知道UIControl將觸摸事件轉換成了帶接收方的控件事件,它本身是個抽象類,只能實例化它的子類來處理控件事件。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之后采用扁平化設計風格,segmentedControlStyle被廢棄,設置了也沒有效果。momentary設置點擊之后是否恢復原樣,默認是NO。numberOfSegments表示選項卡的個數(shù)。apportionSegmentWidthsByContent默認為NO,如果設置為YES,對于寬度為0的segment它將根據(jù)其內(nèi)容自動調(diào)整segment的寬度。selectedSegmentIndex表示當前選中的segment的索引。 tintColor描述View中線條輪廓的顏色,它默認會一直從最底部的View向上層傳遞,直到某個子View修改了tintColor,傳遞鏈斷開,新的tintColor繼續(xù)向上層傳遞。更多關于tintColorbackgroundColorforegroundColor的區(qū)別參考iOS字體顏色圖片部分。


  • 對象方法

     - (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;

以上方法比較簡單,根據(jù)方法名字就知道它的具體功能。需要注意的是initWithItems的數(shù)組參數(shù)既可以是字符串也可以是圖片,segmentedControl會根據(jù)文字或者圖片的寬高自動設置自己的寬高。setContentOffset設置圖片或者文字內(nèi)容相對于單個segment的坐標原點也就是左上角的偏移量,默認是(0,0).更多關于offset,inset的內(nèi)容請參考iOS基本框架UIKit之幾何形狀setEnabled forSegmentAtIndex用來設置指定的索引的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設置背景圖片,barMetrics用于表示在手機屏幕橫豎屏時對圖片進行的拉伸和縮放以適應segment寬高的變化。
setDividerImage用于在你自定義SegmentControl的時候,必須設置左右兩個segment都未選擇時的分割圖片,和左邊選中右邊為選中時的分割圖片以及左邊未選中右邊選中時的分割圖片這3種。
setTitleTextAttributes通過NSAttributedString.h頭文件里面的UIKIT_EXTERN修飾的函數(shù)來設置文字的屬性。更多關于UIKIT_EXTERN宏定義的內(nèi)容參考iOS的宏定義
setContentPositionAdjustment主要用來對一些不同的segment類型內(nèi)容通過offSet調(diào)整內(nèi)容位置。segmentType有以下幾種形式

typedef NS_ENUM(NSInteger, UISegmentedControlSegment) {
    UISegmentedControlSegmentAny = 0,//帶便任何一個segment
    UISegmentedControlSegmentLeft = 1,   // 最左邊的segment,只有segment的個數(shù)大于1時才有效
    UISegmentedControlSegmentCenter = 2, // 任何一個不是最左也不是最右的segment,只有當segment的個數(shù)大于2的時候才有效
    UISegmentedControlSegmentRight = 3,  // 最右邊的segment,只有segment的個數(shù)大于1時才有效
    UISegmentedControlSegmentAlone = 4,  // 當且僅當segment的個數(shù)只有1個時才有效
};

下面是關于使用系統(tǒng)的UISegmentControl以及自定義SegmentControl(繼承系統(tǒng)UISegmentControl)的一個Demo

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容