1. 程式人生 > >iOS自定義UIScrollView的滾動條

iOS自定義UIScrollView的滾動條

UIScrollView有自己預設的滾動條,可設定隱藏和顯示,但是有時候這個預設的滾動條沒辦法滿足我們的需求,那這時候只能通過自定義來實現了。 實現自定義滾動條需要解決的主要問題是:

在scrollview滾動的過程中如何改變滾動條的位置,進而確保滾動條和scrollView在相同時間內走完自己的位移,只要把這個問題解決好了,那我們就可以優雅的自定義滾動條了。

那如何解決這個滾動條的當前滾動位移呢?我們知道,UIScrollView有一個滾動範圍,滾動條也有一個滾動範圍,也就是說兩者的最大的滾動位移是固定的,那要想兩者在相同時間內走完自己的位移,只需要確保兩者的當前滾動位移和總位移之比一致就行。也就是說:

scrollView的當前位移/scrollView的總位移=滾動條的當前位移/滾動條的總位移

得到這個關係後,想要知道滾動條的當前位移,就不是什麼難事了。我們可以通過UIScrollView的代理方法獲取scrollview的當前滾動位移,scrollview的總位移和滾動條的總位移是固定的,那顯然我們可以方便的得出滾動條的當前位移,這樣,得到了滾動條的當前位移,我們就可以通過改變滾動條的frame,進而實現讓滾動條跟隨scrollview滾動。

但是這裡需要注意一點,因為這個位移是相對位移,所以在修改滾動條的frame時,要記得加上滾動條距離相對的參考系的左邊距離,這樣才是其真正的位移。比如現在滾動條的x是從螢幕左邊15開始的,滾動條的滾動範圍是螢幕寬度減去30,那麼當你以螢幕寬度減去30這個數值作為滾動條的滾動總位移,進而算出滾動條的當前位移時,需要加上距離左邊的15才是滾動條真正的位移。

接下來看一下程式碼的具體實現吧:
一、建立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;//陰影透明度,預設0 _scrollView.layer.shadowRadius = 3;//陰影半徑,預設3 } return _scrollView; }

二、建立自定義的滾動條以及在scrollview上加點內容:

-(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 *[email protected][@"• 產品戰略規劃:市場目標、使用者目標、關鍵成功要素分析、管理和運用自己的資源來達成目標\n• 產品戰略實施:有損原則、平衡原則、聚焦原則\n• 產品需求文件:例項講解,牛逼的需求文件是怎麼誕生的\n• 主動:戰略思考、資源爭取\n• 推動:專案立項、迭代跟蹤\n• 溝通:上傳下達、思想一統\n• 平衡:各方協調、跨部溝通\n• 把控:管理得法、取捨有道",
                    @"• 使用者思維:具體案例解析\n• 運營思維:具體案例解析\n• 資料思維:具體案例解析\n• 產品經理的用研能力模型\n• 使用者研究基本概念解析\n• 用研基礎搭建及建設\n• 用研人員分工及工作職責細分"
                    @"• 常用使用者研究方法詳解\n• 桌面研究、定性研究、定量研究三種方法舉例講解及詳細步驟解析\n• 卡諾模型\n• 戰略級的市場及使用者研究\n• 以科學的方法在產品整個生命週期中進行“研究”",
                    @"• 品生命週期使用者研究側重點以及研究方法解讀\n• 產品用研規劃建立\n• 在產品不同生命週期,側重不同用研方法,更準確進行產品迭代",
                    @"• 格局:大格局思維,聚焦做實事\n• 決策:讓瑣碎的運營變有趣,“捨得”之道\n• owner精神:有狼性\n• 敏銳:“細節”出真知\n• 商業素養",
                    @"• 高情商:做個讓人感覺“舒適”的資深運營\n• 凝聚力:1+1>2,善用團隊用人所長,沒有完美的個人,只有優秀的團隊\n• 影響力:在網際網路領域成為運營專家,沉澱經驗,讓成功有跡可循\n• 知識傳承力:資深運營的價值,不是個人優秀,而是讓人人優秀。",
                    @"• 資料運營體系的構成\n• 資料規範與平臺\n• 資料運營體系結構\n• 資料資料平臺構建\n• 核心資料指標\n• 移動端產品資料埋點範例\n• 資料需求指標\n• 產品關鍵資料\n• 資料運營體系的構成",
                       ];

    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的滾動範圍
    _scrollView.contentSize = CGSizeMake(190*contentCount+10, 0);



}

三、在UIScrollView的代理滾動方法中修改滾動條的當前位移:

這裡是以自定義橫向滾動條為例,豎向滾動條也是一樣的原理。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{


    [UIView animateWithDuration:0.5 animations:^{

        CGPoint offset =  scrollView.contentOffset;

        // scrollView的當前位移/scrollView的總位移=滑塊的當前位移/滑塊的總位移
        //        offset/(scrollView.contentSize.width-scrollView.frame.size.width)=滑塊的位移/(slideBackView.frame.size.width-sliderView.frame.size.width)
        //        滑塊距離螢幕左邊的距離加上滑塊的當前位移,即為滑塊當前的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;



    }];
}

這樣,自定義的滾動條就實現了。效果如圖

自定義滾動條.gif

另外,在這裡提一下陰影的使用方法,有時候我們需要加一些陰影效果,怎麼加呢?
主要用到layershadowColor(陰影顏色) 、shadowOffset ()陰影大小、hadowOpacity (陰影透明度)、shadowRadius(陰影圓角)這幾個屬性

如:

        _scrollView.layer.shadowColor = [UIColor redColor].CGColor;//shadowColor陰影顏色
        _scrollView.layer.shadowOffset = CGSizeMake(0,0);//shadowOffset陰影偏移,x向右偏移,y向下偏移
        _scrollView.layer.shadowOpacity = 0.5;//陰影透明度,預設0
        _scrollView.layer.shadowRadius = 3;//陰影半徑,預設3

相關推薦

iOS定義UIScrollView滾動

UIScrollView有自己預設的滾動條,可設定隱藏和顯示,但是有時候這個預設的滾動條沒辦法滿足我們的需求,那這時候只能通過自定義來實現了。 實現自定義滾動條需要解決的主要問題是: 在scrollview滾動的過程中如何改變滾動條的位置,進而確保滾動條和

如何定義CSS滾動的樣式?

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~ 本文由前端林子發表 本文會介紹CSS滾動條選擇器,並在demo中展示如何在Webkit核心瀏覽器和IE瀏覽器中,自定義一個橫向以及一個縱向的滾動條。 0.需求 有的時候我們不想使用瀏覽器預設的滾動條樣式,因為不夠定製化和美觀。那麼如

純CSS定義瀏覽器滾動

先看效果,大家按需求自行修改 具體程式碼: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" con

jQuery 定義網頁滾動樣式外掛 mCustomScrollbar 的介紹和使用方法

系統預設的滾動條樣式,真的已經看的夠噁心了。試想一下,如果在一個很有特色和創意的網頁中,出現了一根系統中預設的滾動條樣式,會有多麼的彆扭。 為了自己定義網頁中的滾動條的方法,我真的已經找了很久了,就目前尋找的成果來說,找到了兩個比較不錯的 jQuery 外掛:jScrollPane 和 mCustomSc

WPF 定義ProgressBar滾動樣式

原文: WPF 自定義ProgressBar滾動條樣式 一、前言 滾動條一般用於載入進度,我們在看視訊的時候或者在瀏覽網頁的時候經常能看到載入進度的頁面。在程式開發中,預設的進度載入樣式可能跟程式風格不太一樣,或者載入進度的時候需要更改一下載入的樣式。這個時候就需要通過修改ProgressBar的樣式來實

純css3定義網頁滾動,瀏覽器統一scroll滾動

支援-webkit-字首的瀏覽器,滾動欄有五個css修飾: 整體部分,    ::-webkit-scrollbar 兩端按鈕,    ::-webkit-scrollbar-button 外層軌道,    ::-webkit-scrollbar-track 內層軌道

定義瀏覽器滾動的樣式,打造屬於你的滾動風格

前段時間,到網上找素材時,看到了一個很個性的滾動條式,開啟Chrome的除錯工具看了一下,發現不是用JavaScript來模擬實現的,覺得有必要折騰一下。於是在各大瀏覽器中對比了一下,發現只用Chrome適用,也就是說這個用的是Chrome的私有CSS屬性。便百之谷之後,發現原來不僅僅只用Chrome,其它的

定義瀏覽器滾動的樣式,打造屬於你的滾動風格——相容IE和webkit(ff不支援)

前段時間,到網上找素材時,看到了一個很個性的滾動條式,開啟Chrome的除錯工具看了一下,發現不是用JavaScript來模擬實現的,覺得 有必要折騰一下。於是在各大瀏覽器中對比了一下,發現只用Chrome適用,也就是說這個用的是Chrome的私有CSS屬性。便百之谷之後,發現原來不 僅僅只用Chrome,

定義瀏覽器滾動的樣式

自定義IE瀏覽器滾動條樣式 追溯瀏覽器對滾動條的自定義,恐怕最早的就是IE瀏覽器了(好像最開始支援的版本是IE5.5)。下面列出了多個版本的支援性況: 滾動條樣式 支援情況 支援瀏覽器版本 可否繼承 描述 scrollbar-3dlight

Android 定義橫向滾動聯動進階版

前一段時間寫了一個自定義橫向滾動條,感覺效果不怎樣好( )。又開始改善結構,使用setScrollView寫了一個聯動進階版。標題的滾動條和內容資料item資料滾動條都可以聯動滾動。豎向是兩個listview,但是是使用全域性的豎向滾動條來滾動。所以橫向與豎向、單擊、長按

JavaScript定義瀏覽器滾動相容IE、 火狐和chrome

今天為大家分享一下我自己製作的瀏覽器滾動條,我們知道用css來自定義滾動條也是挺好的方式,css雖然能夠改變chrome瀏覽器的滾動條樣式可以自定義,css也能夠改變IE瀏覽器滾動條的顏色。但是css只能是改變IE瀏覽器的顏色,而且CSS不能做到改變火狐瀏覽器的樣式和顏色。

[分享] 通過修改CSS定義chrome滾動樣式

首先得說一句 我不懂CSS的寫法之類的 這段CSS也是在網上找的 所以有更先進的需求的話 我肯定不能滿足你們了 不好意思效果圖在10樓有人上了 我這邊不管怎麼弄 上傳圖片都卡在96% 而且不翻wall不能回帖 翻wall的情況下 上論壇這個慢啊 所以 大家去看這個圖吧htt

定義WPF滾動(ScrollViewer):仿蘋果系統規劃

<Window.Resources> <SolidColorBrush x:Key="NormalColor">Red</SolidColorBrush> <SolidColorBrush x:K

CSS3定義瀏覽器滾動樣式

active attr 圖片說明 track -s ima trac borde cto 一個完整滾動條右以下部分組成: ::-webkit-scrollbar 滾動條整體部分,常用屬性:width,height,background,border; :

IOS定義圖片瀏覽器,支援瀏覽多張圖片,點選,雙擊,兩手指縮放操作,並顯示載入進度

圖片瀏覽器Controller的主要思路是:新建一個 JZAlbumViewController,在這個controller裡主要顯示一個UIScrollView,這個UIScrollView用來顯

IOS-一步一步教你定義評分星級RatingBar

//  RatingBar.m // //  Created by HailongHan on 15/1/1. //  Copyright (c) 2015年 cubead. All rights reserved. // #import "RatingBar.h" @interface RatingBar

iOS 定義重新整理控制元件UIScrollView (Refresh)

前言: 開發的時候經常會用到下拉重新整理這個控制元件,一直以來想自己寫一個,但是時間問題,都是使用別人寫好的,今天查了資料,自己自定一個 1.主要原理:        a.建立UIScrollView的類目 提供 類似addHeaderRefresh等方法,這樣tabl

[iOS 定義導航欄/導航]隱藏系統導航

先看效果 第一種 程式碼裡改變了導航條顏色 第二種 固定導航顏色的 其實這兩個沒什麼區別,主要是封裝了一個導航條NavigationBar 繼承自UIView 思路 使用程式碼,例項化導航條(前提是已經在設定導航控制器的時候 隱

ios 定義鍵盤的return鍵以及鍵盤的其他一些屬性

variable 位置 arch ext ddr gin character 觸發 hone //初始化textfield並設置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20

IOS 定義按鈕(代碼實現)+九宮格

uifont 排列 end uiview height iyu void rec name 在一些下載應用裏整個頁面都是按鈕,有好多好多,但是仔細觀察不難發現他們很有規律。就像下面一樣?? 很有規律的排列在屏幕上,那麽這需要我們怎麽去做能。 正如標題,我們需要了解兩個知