自定制UISlider實(shí)現(xiàn)點(diǎn)擊,拖動(dòng),松手等操作

滑塊不靈敏, 點(diǎn)擊小范圍錯(cuò)位,調(diào)整滑條高度 ,圓角 ,slider和navgation右滑返回沖突等問(wèn)題

效果圖


點(diǎn)擊,滑動(dòng),滑動(dòng)松手.gif

.h中

###這個(gè)block是用來(lái)在滑動(dòng)條變的時(shí)候所在界面ui隨之變化,本文拖動(dòng)滑動(dòng)條字體隨著變化###
typedef void(^isSliderBallMoved)(BOOL isMoved , NSInteger currentValue);

@interface GOVFontSlider : UISlider<UIGestureRecognizerDelegate>
@property (copy, nonatomic) isSliderBallMoved isSliderBallMoved;
@end

.m中
1.修改滑條寬高
bounds: 整個(gè)slider在界面的位置大小
rect :滑條的在整個(gè)slider的位置大小

@implementation GOVFontSlider
// 返回滑條的frame
- (CGRect)trackRectForBounds:(CGRect)bounds{
    return CGRectMake(LAYOUT_SIZESCALE_PORTRAIT(70, 70).width, bounds.size.height /2.0 , LAYOUT_SCREENSIZE_P.width - 2 * LAYOUT_SIZESCALE_PORTRAIT(70, 70).width, 1);
}
// 返回滑塊的frame,滑塊滑動(dòng)不靈敏的話調(diào)整它的高度
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value{
    
    return CGRectMake(rect.origin.x - LAYOUT_SIZESCALE_PORTRAIT(1, 1).width / 2.0 + value * (rect.size.width / 4.0), 0,LAYOUT_SIZESCALE_PORTRAIT(1, 1).width, bounds.size.height);
}

注: 滑塊的寬度設(shè)置過(guò)大導(dǎo)致點(diǎn)擊某點(diǎn),滑塊會(huì)在該點(diǎn)有小位移變化


滑塊的寬度設(shè)置過(guò)大導(dǎo)致點(diǎn)擊時(shí)小位移變化的bug.gif
#最開(kāi)始是用
[sliderView addTarget:self action:@selector(sliderValueChanged:) forControlEvents:UIControlEventValueChanged]  
 [sliderView addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventTouchUpInside];
UITapGestureRecognizer

添加的滑動(dòng)事件和點(diǎn)擊還有滑動(dòng)松手事件,后面發(fā)現(xiàn)滑動(dòng)松手時(shí)和點(diǎn)擊事件經(jīng)常會(huì)沖突,點(diǎn)擊手勢(shì)識(shí)別的是剛觸碰slider時(shí)的那個(gè)點(diǎn)A,滑動(dòng)松手時(shí)又是另一個(gè)點(diǎn)B(我想取得是B點(diǎn),但偶爾會(huì)識(shí)別為A點(diǎn)),所以就直接用touch方法
點(diǎn)擊

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
   [self fontTouchBeganMovedEnded:touches withEvent:event withIsFastAction:NO];
}

滑動(dòng) 松手

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
 
    [self fontTouchBeganMovedEnded:touches withEvent:event withIsFastAction:YES];
}

移動(dòng)

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self fontTouchBeganMovedEnded:touches withEvent:event withIsFastAction:NO];
}
第三個(gè)參數(shù),是否直接回到整點(diǎn)位置(就近取整)
- (void)fontTouchBeganMovedEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event withIsFastAction:(BOOL)isFastBack{
    NSSet *allTouches = event.allTouches;
    UITouch *touch = [allTouches anyObject];;
    CGPoint touchPoint = [touch locationInView:self];
    CGFloat value = (self.maximumValue - self.minimumValue) * ((touchPoint.x- LAYOUT_SIZESCALE_PORTRAIT(70, 70).width) / (self.frame.size.width - 2 * LAYOUT_SIZESCALE_PORTRAIT(70, 70).width));
    NSInteger finalValue = round(value);   #// 對(duì)value取整,回到整數(shù)位置
   #// 我設(shè)置的滑條范圍是0~4,點(diǎn)擊范圍外的判斷
    finalValue = finalValue < 0 ? 0: finalValue;
    finalValue = finalValue > 4 ? 4 :finalValue;
    [UIView animateWithDuration:0.5 animations:^{
        [self setValue:isFastBack ? finalValue :value animated:YES];
    }];     // 因?yàn)榧恿藙?dòng)畫(huà),在ios8,5s下會(huì)看到最右邊滑動(dòng)時(shí)小范圍變白,因?yàn)閾Q了滑動(dòng)條顏色的原因,將滑動(dòng)條顏色更改為系統(tǒng)顏色,bug消失,或者去掉動(dòng)畫(huà); 或者在互動(dòng)條下面加一條同等的線條來(lái)解決
    if (self.isSliderBallMoved != nil) {
        self.isSliderBallMoved(YES,finalValue);  #// 用來(lái)改變界面其他的UI
    }
   
}
@end

使用

   GOVFontSlider *sliderView = [[GOVFontSlider alloc]initWithFrame: CGRectMake(0, LAYOUT_SIZESCALE_PORTRAIT(200, 200).height, LAYOUT_SCREENSIZE_P.width , LAYOUT_SIZESCALE_PORTRAIT(100, 100).height)];
    [sliderView setThumbImage:[GOVCommon loadAppImage:@"settingFontSliderBall"] forState:UIControlStateNormal];
    [sliderView setThumbImage:[GOVCommon loadAppImage:@"settingFontSliderBall"] forState:UIControlStateHighlighted];
    sliderView.maximumValue = 4;
    sliderView.minimumValue = 0;
    [sliderView setValue:fontSize animated:NO];
    sliderView.minimumTrackTintColor = [UIColor lightGrayColor];

圓角滑動(dòng)條

  sliderView.layer.cornerRadius = imageView.frame.size.width / 2;
   //將多余的部分切掉
  sliderView.layer.masksToBounds = YES;
[cell.contentView addSubview:sliderView ];
sliderView.isSliderBallMoved = ^(BOOL isMoved, NSInteger currentValue) {
    if (isMoved == YES) {
        exampleLabel.font = FONT_SIZE_REGULAR_SCALE(fontArray[currentValue], YES);
    }
};

右滑返回手勢(shì)沖突, 也可能會(huì)造成滑塊不靈敏

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党觅,隨后出現(xiàn)的幾起案子畏吓,更是在濱河造成了極大的恐慌,老刑警劉巖豁陆,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吵护,居然都是意外死亡盒音,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門馅而,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祥诽,“玉大人,你說(shuō)我怎么就攤上這事瓮恭⌒燮海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵屯蹦,是天一觀的道長(zhǎng)维哈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颇玷,這世上最難降的妖魔是什么笨农? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮帖渠,結(jié)果婚禮上谒亦,老公的妹妹穿的比我還像新娘。我一直安慰自己空郊,他們只是感情好份招,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狞甚,像睡著了一般锁摔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哼审,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天谐腰,我揣著相機(jī)與錄音,去河邊找鬼涩盾。 笑死十气,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的春霍。 我是一名探鬼主播砸西,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了芹枷?” 一聲冷哼從身側(cè)響起衅疙,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳慈,沒(méi)想到半個(gè)月后饱溢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝶涩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年理朋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绿聘。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖次舌,靈堂內(nèi)的尸體忽然破棺而出熄攘,到底是詐尸還是另有隱情,我是刑警寧澤彼念,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布挪圾,位于F島的核電站,受9級(jí)特大地震影響逐沙,放射性物質(zhì)發(fā)生泄漏哲思。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一吩案、第九天 我趴在偏房一處隱蔽的房頂上張望棚赔。 院中可真熱鬧,春花似錦徘郭、人聲如沸靠益。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胧后。三九已至,卻和暖如春抱环,著一層夾襖步出監(jiān)牢的瞬間壳快,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工镇草, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留眶痰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓陶夜,卻偏偏與公主長(zhǎng)得像凛驮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子条辟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 這篇博客主要是闡述四個(gè)繼承于UIControl的視圖控制器 首先介紹的是UISwitch, 人們習(xí)慣叫它開(kāi)關(guān). 如...
    我與太陽(yáng)肩并肩閱讀 1,477評(píng)論 0 12
  • 一. QQ音樂(lè)播放器的簡(jiǎn)單實(shí)現(xiàn) 每個(gè)音樂(lè)播放器的實(shí)現(xiàn)都大致相同黔夭,個(gè)人認(rèn)為難點(diǎn)在于歌曲播放與Slider的同步宏胯,歌詞...
    xx_cc閱讀 7,963評(píng)論 20 53
  • 翻譯文章 有時(shí)系統(tǒng)提供的控件不能滿足需求時(shí),可以考慮自定義控件本姥。比如肩袍,你需要開(kāi)發(fā)一個(gè)控件能讓用戶過(guò)濾商品的價(jià)格,你...
    zziazm閱讀 2,409評(píng)論 2 3
  • 陰雨婚惫,夜色冷清氛赐。 心情莫名的低落。不想打開(kāi)電視先舷,有聲的東西艰管,太吵鬧圆裕。還是一個(gè)人安靜的呆著娘赴,如此,也正應(yīng)這樣的天氣苗傅。...
    北斗兒閱讀 322評(píng)論 1 4
  • 今天偶爾打掃房間捺球,翻出了剛來(lái)深圳的房租繳費(fèi)單缸浦,看著這張紙,真的是感慨萬(wàn)千氮兵×阎穑回想著那時(shí)候和老公剛來(lái)到深圳,人生地不熟...
    Moris_L閱讀 249評(píng)論 1 1