iOS自定義UIScrollView的滾動(dòng)條

UIScrollView有自己默認(rèn)的滾動(dòng)條锅必,可設(shè)置隱藏和顯示,但是有時(shí)候這個(gè)默認(rèn)的滾動(dòng)條沒辦法滿足我們的需求,那這時(shí)候只能通過自定義來實(shí)現(xiàn)了秉犹。 實(shí)現(xiàn)自定義滾動(dòng)條需要解決的主要問題是:

在scrollview滾動(dòng)的過程中如何改變滾動(dòng)條的位置,進(jìn)而確保滾動(dòng)條和scrollView在相同時(shí)間內(nèi)走完自己的位移稚晚,只要把這個(gè)問題解決好了崇堵,那我們就可以優(yōu)雅的自定義滾動(dòng)條了。

那如何解決這個(gè)滾動(dòng)條的當(dāng)前滾動(dòng)位移呢客燕?我們知道鸳劳,UIScrollView有一個(gè)滾動(dòng)范圍,滾動(dòng)條也有一個(gè)滾動(dòng)范圍也搓,也就是說兩者的最大的滾動(dòng)位移是固定的赏廓,那要想兩者在相同時(shí)間內(nèi)走完自己的位移,只需要確保兩者的當(dāng)前滾動(dòng)位移和總位移之比一致就行傍妒。也就是說:

scrollView的當(dāng)前位移/scrollView的總位移=滾動(dòng)條的當(dāng)前位移/滾動(dòng)條的總位移

得到這個(gè)關(guān)系后幔摸,想要知道滾動(dòng)條的當(dāng)前位移,就不是什么難事了颤练。我們可以通過UIScrollView的代理方法獲取scrollview的當(dāng)前滾動(dòng)位移既忆,scrollview的總位移和滾動(dòng)條的總位移是固定的,那顯然我們可以方便的得出滾動(dòng)條的當(dāng)前位移,這樣尿贫,得到了滾動(dòng)條的當(dāng)前位移电媳,我們就可以通過改變滾動(dòng)條的frame,進(jìn)而實(shí)現(xiàn)讓滾動(dòng)條跟隨scrollview滾動(dòng)庆亡。

但是這里需要注意一點(diǎn)匾乓,因?yàn)檫@個(gè)位移是相對(duì)位移,所以在修改滾動(dòng)條的frame時(shí)又谋,要記得加上滾動(dòng)條距離相對(duì)的參考系的左邊距離拼缝,這樣才是其真正的位移。比如現(xiàn)在滾動(dòng)條的x是從屏幕左邊15開始的彰亥,滾動(dòng)條的滾動(dòng)范圍是屏幕寬度減去30咧七,那么當(dāng)你以屏幕寬度減去30這個(gè)數(shù)值作為滾動(dòng)條的滾動(dòng)總位移,進(jìn)而算出滾動(dòng)條的當(dāng)前位移時(shí)任斋,需要加上距離左邊的15才是滾動(dòng)條真正的位移继阻。

接下來看一下代碼的具體實(shí)現(xiàn)吧:
一、創(chuàng)建scrollview:(記得簽代理UIScrollViewDelegate)

-(UIScrollView *)scrollView{
    if (!_scrollView) {
        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 164, self.view.frame.size.width, 233)];
        _scrollView.delegate = self;
        _scrollView.scrollEnabled = YES;
        _scrollView.bounces = NO;
        _scrollView.showsHorizontalScrollIndicator=NO;
        _scrollView.layer.shadowColor = [UIColor redColor].CGColor;//shadowColor陰影顏色
        _scrollView.layer.shadowOffset = CGSizeMake(0,0);//shadowOffset陰影偏移,x向右偏移废酷,y向下偏移
        _scrollView.layer.shadowOpacity = 0.5;//陰影透明度瘟檩,默認(rèn)0
        _scrollView.layer.shadowRadius = 3;//陰影半徑,默認(rèn)3

    }
    return _scrollView;
}

二澈蟆、創(chuàng)建自定義的滾動(dòng)條以及在scrollview上加點(diǎn)內(nèi)容:

-(void)loadView{
    [super loadView];
    [self.view addSubview:self.scrollView];

    slideBackView=[[UIView alloc] initWithFrame:CGRectMake(15, _scrollView.frame.origin.y+_scrollView.frame.size.height+20, self.view.frame.size.width-30, 8)];
    [self.view addSubview:slideBackView];
    slideBackView.backgroundColor = [UIColor colorWithRed:0.91 green:0.91 blue:0.91 alpha:1.00];
    slideBackView.layer.cornerRadius = 4;
   
    
    sliderView = [[UIView alloc] init];
    [self.view addSubview:sliderView];
    sliderView.frame=CGRectMake(slideBackView.frame.origin.x, slideBackView.frame.origin.y+(slideBackView.frame.size.height-7 )/2, 40 , 7 );
    sliderView.backgroundColor =[UIColor colorWithRed:0.12 green:0.72 blue:0.88 alpha:1.00];
    sliderView.layer.cornerRadius = 3.5;
 
 NSArray *textDesArr=@[@"? 產(chǎn)品戰(zhàn)略規(guī)劃:市場(chǎng)目標(biāo)墨辛、用戶目標(biāo)、關(guān)鍵成功要素分析趴俘、管理和運(yùn)用自己的資源來達(dá)成目標(biāo)\n? 產(chǎn)品戰(zhàn)略實(shí)施:有損原則睹簇、平衡原則、聚焦原則\n? 產(chǎn)品需求文檔:實(shí)例講解寥闪,牛逼的需求文檔是怎么誕生的\n? 主動(dòng):戰(zhàn)略思考太惠、資源爭(zhēng)取\n? 推動(dòng):項(xiàng)目立項(xiàng)、迭代跟蹤\n? 溝通:上傳下達(dá)疲憋、思想一統(tǒng)\n? 平衡:各方協(xié)調(diào)垛叨、跨部溝通\n? 把控:管理得法、取舍有道",
                    @"? 用戶思維:具體案例解析\n? 運(yùn)營(yíng)思維:具體案例解析\n? 數(shù)據(jù)思維:具體案例解析\n? 產(chǎn)品經(jīng)理的用研能力模型\n? 用戶研究基本概念解析\n? 用研基礎(chǔ)搭建及建設(shè)\n? 用研人員分工及工作職責(zé)細(xì)分"
                    @"? 常用用戶研究方法詳解\n? 桌面研究柜某、定性研究嗽元、定量研究三種方法舉例講解及詳細(xì)步驟解析\n? 卡諾模型\n? 戰(zhàn)略級(jí)的市場(chǎng)及用戶研究\n? 以科學(xué)的方法在產(chǎn)品整個(gè)生命周期中進(jìn)行“研究”",
                    @"? 品生命周期用戶研究側(cè)重點(diǎn)以及研究方法解讀\n? 產(chǎn)品用研規(guī)劃建立\n? 在產(chǎn)品不同生命周期,側(cè)重不同用研方法喂击,更準(zhǔn)確進(jìn)行產(chǎn)品迭代",
                    @"? 格局:大格局思維剂癌,聚焦做實(shí)事\n? 決策:讓瑣碎的運(yùn)營(yíng)變有趣,“舍得”之道\n? owner精神:有狼性\n? 敏銳:“細(xì)節(jié)”出真知\n? 商業(yè)素養(yǎng)",
                    @"? 高情商:做個(gè)讓人感覺“舒適”的資深運(yùn)營(yíng)\n? 凝聚力:1+1>2翰绊,善用團(tuán)隊(duì)用人所長(zhǎng)佩谷,沒有完美的個(gè)人旁壮,只有優(yōu)秀的團(tuán)隊(duì)\n? 影響力:在互聯(lián)網(wǎng)領(lǐng)域成為運(yùn)營(yíng)專家,沉淀經(jīng)驗(yàn)谐檀,讓成功有跡可循\n? 知識(shí)傳承力:資深運(yùn)營(yíng)的價(jià)值抡谐,不是個(gè)人優(yōu)秀,而是讓人人優(yōu)秀桐猬。",
                    @"? 數(shù)據(jù)運(yùn)營(yíng)體系的構(gòu)成\n? 數(shù)據(jù)規(guī)范與平臺(tái)\n? 數(shù)據(jù)運(yùn)營(yíng)體系結(jié)構(gòu)\n? 數(shù)據(jù)數(shù)據(jù)平臺(tái)構(gòu)建\n? 核心數(shù)據(jù)指標(biāo)\n? 移動(dòng)端產(chǎn)品數(shù)據(jù)埋點(diǎn)范例\n? 數(shù)據(jù)需求指標(biāo)\n? 產(chǎn)品關(guān)鍵數(shù)據(jù)\n? 數(shù)據(jù)運(yùn)營(yíng)體系的構(gòu)成",
                       ];

    NSInteger contentCount=textDesArr.count;
    for (NSInteger i = 0; i <contentCount; i++) {
  
            UILabel *textDesLabel=[[UILabel alloc] initWithFrame:CGRectMake(10+190 *i,0, 180 , 233 )];
            [_scrollView addSubview:textDesLabel];
            textDesLabel.textColor=[UIColor colorWithRed:0.49 green:0.49 blue:0.49 alpha:1.00];
            textDesLabel.font = [UIFont systemFontOfSize:12 ];
            textDesLabel.text = textDesArr[i];
            textDesLabel.numberOfLines = 0;
            textDesLabel.layer.borderWidth = 0.5;
            textDesLabel.layer.borderColor = [UIColor colorWithRed:0.91 green:0.91 blue:0.91 alpha:1.00].CGColor;
            textDesLabel.backgroundColor = [UIColor whiteColor];
        
 
    }
    
   //scrollView的滾動(dòng)范圍
    _scrollView.contentSize = CGSizeMake(190*contentCount+10, 0);
    

    
}

三麦撵、在UIScrollView的代理滾動(dòng)方法中修改滾動(dòng)條的當(dāng)前位移:

這里是以自定義橫向滾動(dòng)條為例,豎向滾動(dòng)條也是一樣的原理溃肪。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    
    [UIView animateWithDuration:0.5 animations:^{
        
        CGPoint offset =  scrollView.contentOffset;
        
        // scrollView的當(dāng)前位移/scrollView的總位移=滑塊的當(dāng)前位移/滑塊的總位移
        //        offset/(scrollView.contentSize.width-scrollView.frame.size.width)=滑塊的位移/(slideBackView.frame.size.width-sliderView.frame.size.width)
        //        滑塊距離屏幕左邊的距離加上滑塊的當(dāng)前位移免胃,即為滑塊當(dāng)前的x
        
        CGRect frame=sliderView.frame;
        
        frame.origin.x=15 + offset.x*(slideBackView.frame.size.width-sliderView.frame.size.width)/(scrollView.contentSize.width-scrollView.frame.size.width);
        
        sliderView.frame = frame;
        
        
        
    }];
}

這樣,自定義的滾動(dòng)條就實(shí)現(xiàn)了惫撰。效果如圖

自定義滾動(dòng)條.gif

另外羔沙,在這里提一下陰影的使用方法,有時(shí)候我們需要加一些陰影效果厨钻,怎么加呢扼雏?
主要用到layershadowColor(陰影顏色) 、shadowOffset (陰影大小),shadowOpacity (陰影透明度)夯膀、shadowRadius(陰影圓角)這幾個(gè)屬性

如:

        _scrollView.layer.shadowColor = [UIColor redColor].CGColor;//shadowColor陰影顏色
        _scrollView.layer.shadowOffset = CGSizeMake(0,0);//shadowOffset陰影偏移,x向右偏移诗充,y向下偏移
        _scrollView.layer.shadowOpacity = 0.5;//陰影透明度,默認(rèn)0
        _scrollView.layer.shadowRadius = 3;//陰影半徑棍郎,默認(rèn)3

demo地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市银室,隨后出現(xiàn)的幾起案子涂佃,更是在濱河造成了極大的恐慌,老刑警劉巖蜈敢,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辜荠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抓狭,警方通過查閱死者的電腦和手機(jī)伯病,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來否过,“玉大人午笛,你說我怎么就攤上這事∶绻穑” “怎么了药磺?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)煤伟。 經(jīng)常有香客問我癌佩,道長(zhǎng)木缝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任围辙,我火速辦了婚禮我碟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姚建。我一直安慰自己矫俺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布桥胞。 她就那樣靜靜地躺著恳守,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贩虾。 梳的紋絲不亂的頭發(fā)上催烘,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音缎罢,去河邊找鬼伊群。 笑死,一個(gè)胖子當(dāng)著我的面吹牛策精,可吹牛的內(nèi)容都是我干的舰始。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼咽袜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丸卷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起询刹,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤谜嫉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凹联,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沐兰,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蔽挠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了住闯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澳淑,死狀恐怖比原,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠巡,我是刑警寧澤春寿,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站忽孽,受9級(jí)特大地震影響绑改,放射性物質(zhì)發(fā)生泄漏谢床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一厘线、第九天 我趴在偏房一處隱蔽的房頂上張望识腿。 院中可真熱鬧,春花似錦造壮、人聲如沸渡讼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽成箫。三九已至,卻和暖如春旨枯,著一層夾襖步出監(jiān)牢的瞬間蹬昌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工攀隔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皂贩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓昆汹,卻偏偏與公主長(zhǎng)得像明刷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子满粗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)辈末、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,059評(píng)論 4 62
  • 這是錢穆先生很久以前的書映皆,1961年的挤聘,但即使在今天讀來仍然有所教益。 這本書從一系列基本方法論的角度講如何理解中...
    馬唐閱讀 132評(píng)論 0 0
  • 看到“生而為贏”四個(gè)字是幾天前的事了劫扒。今天再次出現(xiàn)在視野檬洞,我想這輩子是躲不掉了狸膏。 這四個(gè)字曾是高二一直呼吁...
    聰明蛋閱讀 277評(píng)論 0 1
  • “奓”字對(duì)于好些人來說是陌生的沟饥。《新華詞典》權(quán)威解釋:奓湾戳, zha 四聲贤旷,張開的意思(如:頭發(fā)奓著);zha...
    大荔老賈閱讀 2,155評(píng)論 4 2