【iOS開發(fā)】UISlider使用詳解及滑動間隔固定數(shù)值處理

UISlider是開發(fā)中不太常用到的一種基礎控件挽荡。雖然不常用到洽胶, 但是我們卻常見到:

手機系統(tǒng)設置里->顯示與亮度瓢阴,就有這樣的一個slider:

顯示與亮度

系統(tǒng)的UISlider創(chuàng)建出來也是如此络拌。

但是在實際開發(fā)中鬼癣, 設計師根據(jù)產(chǎn)品風格設計出不同的slider樣式后饵骨, 這很多人都選擇直接去自定義view來實現(xiàn)效果翘悉, 其實這樣超麻煩!

自定義的slider無外乎就是最大最小值的樣式居触, 滑塊的樣式妖混,以及滑竿的樣式等。

這樣自定義完成可以依靠UISlider的API來實現(xiàn):

// 默認為nil轮洋, 控件左側(cè)的圖像
@property(nullable, nonatomic,strong) UIImage *minimumValueImage;      

// 默認為nil制市, 控件右側(cè)的圖像
@property(nullable, nonatomic,strong) UIImage *maximumValueImage;  

// 滑塊左邊線條的圖像
- (void)setMinimumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;

// 滑塊右邊線條的圖像
- (void)setMaximumTrackImage:(nullable UIImage *)image forState:(UIControlState)state;

// 滑塊左邊線條的顏色
@property(nullable, nonatomic,strong) UIColor *minimumTrackTintColor;

// 滑塊右邊線條的顏色
@property(nullable, nonatomic,strong) UIColor *maximumTrackTintColor;

/**
 *  這里有個小重點:
 *  如果即設置了滑塊的圖像弊予,又設置了滑塊的顏色祥楣,那么滑塊的圖像將不再顯示,滑塊的顏色會發(fā)生改變汉柒。
 **/
// 滑塊的圖像
- (void)setThumbImage:(nullable UIImage *)image forState:(UIControlState)state;

// 滑塊的顏色
@property(nullable, nonatomic,strong) UIColor *thumbTintColor误褪;

以上的這些API都是對UISlider進行UI上的修改。

但常常大家會發(fā)現(xiàn)碾褂, 設置完成后兽间, 左右圖像的大小, 滑塊的大小正塌, 滑竿的高度等等都和設計圖不符嘀略, 特別是滑竿距離左右兩邊的圖像還有一定的空隙。

不需要著急传货, 此時只需要創(chuàng)建一個UISlider的子類屎鳍,并重寫這幾個方法:

// 左右兩側(cè)圖像尺寸
- (CGRect)minimumValueImageRectForBounds:(CGRect)bounds;
- (CGRect)maximumValueImageRectForBounds:(CGRect)bounds;

// 滑條尺寸
- (CGRect)trackRectForBounds:(CGRect)bounds;

//  滑塊尺寸
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value;

先看一個對比效果圖,上面為UISlider问裕, 下面為繼承UISlider的子類:

直接上代碼:

  1. 創(chuàng)建UISlider子類逮壁,并重寫滑條尺寸
#import "LWSlider.h"

@implementation LWSlider

// 設置track(滑條)尺寸
- (CGRect)trackRectForBounds:(CGRect)bounds{

    bounds.origin.y = (bounds.size.height - 2)/2.0;
    bounds.size.height = 2;
    
    return bounds;
}

@end
  1. 創(chuàng)建LWSlider對象, 并設置對應的圖像
- (LWSlider *)slider2{
    if (!_slider2) {
        _slider2 = [[LWSlider alloc] init];
        _slider2.minimumValue = 0;
        _slider2.maximumValue = _slider2Numbers.count - 2;
        _slider2.value = 3;
        
        _slider2.minimumValueImage = GetImage(@"slider-min");
        _slider2.maximumValueImage = GetImage(@"slider-max");
        _slider2.minimumTrackTintColor = BtnBgColor;
        _slider2.maximumTrackTintColor = UIColorFromHEXA(0xE5E5E5, 1.0);
        [_slider2 setThumbImage:GetImage(@"slider") forState:UIControlStateNormal];
        
        [_slider2 addTarget:self action:@selector(slidervalueDidChanged:) forControlEvents:UIControlEventValueChanged];
    }
    return _slider2;
}

寫到這里就可以自定義一個想要的slider了粮宛, 但是有些產(chǎn)品會要求窥淆, slider滑動時要有一定的間隔卖宠, 比如,每滑動一次就直接過5%忧饭?

遇到這樣的情況又要怎么做呢扛伍?

我在網(wǎng)上看到有人用長度計算的方式, 在UIControlEventValueChanged事件里根據(jù)當前滑動值去進行一大堆的數(shù)學計算词裤, 然后重新設置slider的value值刺洒。

這樣寫雖然也達到了其想要的效果, 但是很麻煩吼砂。

下面給大家介紹一個簡單的方法:

  1. 創(chuàng)建一個滑動值數(shù)組
 _slider2Numbers = [[NSMutableArray alloc] init];
 for (int i = -1; i < 25; ++i) {
    [_slider2Numbers addObject:@(i * 0.5)];
 }
  1. 設置slider的最大最小值
_slider2.minimumValue = 0;
_slider2.maximumValue = _slider2Numbers.count - 2;
  1. UIControlEventValueChanged事件里進行處理
    當slider滑動時逆航, 將slider.value作為索引值,去獲取滑動值數(shù)組里相對應索引位置的數(shù)值渔肩, 并將其設置到界面上
- (void)slidervalueDidChanged:(UISlider *)slider{
    NSString *value = [_slider2Numbers objectAtIndex:slider.value + 1];
    self.subTitleLab2.text = [NSString stringWithFormat:@"%@h",value];
}
滑動間隔固定處理效果如下圖:

以上因俐,END。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末周偎,一起剝皮案震驚了整個濱河市抹剩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蓉坎,老刑警劉巖澳眷,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袍嬉,居然都是意外死亡境蔼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門伺通,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逢享,你說我怎么就攤上這事罐监。” “怎么了瞒爬?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵弓柱,是天一觀的道長。 經(jīng)常有香客問我侧但,道長矢空,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任禀横,我火速辦了婚禮屁药,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柏锄。我一直安慰自己酿箭,他們只是感情好复亏,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著缭嫡,像睡著了一般缔御。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妇蛀,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天耕突,我揣著相機與錄音,去河邊找鬼评架。 笑死眷茁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的古程。 我是一名探鬼主播蔼卡,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挣磨!你這毒婦竟也來了雇逞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茁裙,失蹤者是張志新(化名)和其女友劉穎塘砸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晤锥,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡掉蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾瘾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片女轿。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖壕翩,靈堂內(nèi)的尸體忽然破棺而出蛉迹,到底是詐尸還是另有隱情,我是刑警寧澤放妈,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布北救,位于F島的核電站,受9級特大地震影響芜抒,放射性物質(zhì)發(fā)生泄漏珍策。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一宅倒、第九天 我趴在偏房一處隱蔽的房頂上張望攘宙。 院中可真熱鬧,春花似錦、人聲如沸模聋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链方。三九已至持痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間祟蚀,已是汗流浹背工窍。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留前酿,地道東北人患雏。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像罢维,于是被迫代替她去往敵國和親淹仑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容