天天看點

ScrollView詳解

建立方式

1:StoryBoard/Xib

這裡StoarBoard就不多說,直接拖就可以,說太多沒意思,如果連這個都不會我隻能先給你跪了!

2:代碼:

當你建立完滾動視圖後,你可以将另一個視圖的内容粘合到滾動視圖的空白頁上。這回建立一個滾動的内容視窗:

1 [ scrollView addSubview:myView];  

UIScrollView使用的步驟

     1.建立UIScrollView

     2.将需要展示的内容添加到UIScrollView中

     3.設定UIScrollView的滾動範圍 (contentSize)

基本屬性

scrollView不能滾動的幾種情況

     1.沒有設定contentSize

     2.scrollEnabled屬性 = NO

     3.userInteractionEnabled屬性 = NO

self.scrollView.scrollEnabled = NO;

self.scrollView.userInteractionEnabled = NO;

enabled和userInteractionEnabled的差別

     enabled: 代表控件不可用

     userInteractionEnabled: 代表控件不可以和使用者互動, 也就是不能響應使用者的操作

注意: 如果想讓UIScrollView進行滾動, 必須設定可以滾動的範圍

設定scrollView的滾動範圍為, frame的寬高 + 100

self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width + 100, self.scrollView.frame.size.height + 100);

2.設定滾動範圍

self.scrollView.contentSize = iv.image.size;

// 如何去掉滾動條

self.scrollView.showsHorizontalScrollIndicator = NO;

self.scrollView.showsVerticalScrollIndicator = NO;

滾動條也是scrollView的子控件的一部分

滾動條可能在子控件的前面, 也可能在子控件的後面

正是因為這個原始, 是以以後在開發中不推薦大家通過subviews擷取子控件的方式來操作子控件

[self.scrollView.subviews lastObject];

設定滾動條的樣式

self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;

預設情況下UIScrollView有一個回彈效果

隻要設定了contentSize就有回彈效果

self.scrollView.bounces = YES;

設定預設是否有回彈效果 (預設就是沒有設定contentSize的情況)

垂直方向可以回彈

下拉重新整理

哪怕沒有設定contentSize也可以有回彈效果

    self.scrollView.alwaysBounceVertical = YES;

    self.scrollView.alwaysBounceHorizontal = YES;

3.設定邊距

self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 30, 40);

注意點:contentOffset移動的位置是一個臨時的位置, 隻要輕輕拖拽一下就會回到預設的位置

    CGFloat offsetX = self.sc.contentSize.width - self.sc.frame.size.width;

    CGFloat offsetY = self.sc.contentSize.height - self.sc.frame.size.height;

    [self.sc setContentOffset:CGPointMake(offsetX, offsetY) animated:YES];

-----------------------代理:----------------------------

如何監聽一個控件的變化/狀态

1. 首先需要檢視該控件的頭檔案, 看它繼承于誰

        1.1如果繼承于UIControl, 那麼就可以通過addTarget來監聽

        1.2如果繼承于UIView, 那麼必須通過代理來監聽

——————————————————————————————————————————————————————

代理協定的規律:

     以控件的類名開頭, 後面加上delegate

代理協定中的方法名的規律:

     一般以控件名稱去掉類字首開頭

代理協定中的方法參數的規律:

     誰觸發事件, 就将誰傳遞進來

如何監聽UIScrollView的變化

     1.成為UIScrollView的代理

     2.遵守UIScrollView的協定

     3.實作UIScrollView協定中的方法

代理作用:

     當A對象想監聽B對象的變化 , 那麼可以讓A成為B的代理

     當B對象發生一些變化想通知A對象, 那麼可以讓A成為B的代理

/**************************代理方法***********************************/

#pragma mark - UIScrollViewDelegate

// 隻要成為了UIScrollView的代理, 遵守代理協定, 實作協定中的方法

// 當UIScrollView發生一些變化的時候, 系統就會自動調用這些代理方法

// scrollViewDidScroll方法什麼時候調用?

// 隻要UIScrollView滾動了, 系統就會自動調用

// 使用者已經結束拖拽, 代表使用者已經松手了

// 系統調用了該方法并不代表着,UIScrollView已經停止滾動了

// 每次調用 停止拖拽方法時 ,系統都會傳入一個目前是否有慣性的參數

// 我們可以判斷該參數是否為YES, 如果是YES代表目前UIScrollView有慣性, 停止拖拽并不會停止滾動, 需要在停止減速方法中監聽什麼時候真正的停止

結合前面MVC中的九宮格案例使用UIScrollView實作,并且設定滾動到對應的位置:

//6.設定shopsView的滾動範圍

注意:

如果想在UIScrollView停止滾動之後做一些操作, 有兩種情況

 1.沒有慣性的情況: 隻會調用 停止拖拽的方法, 不會調用停止減速的方法

 2.有慣性的情況: 既會調用 停止拖拽的方法, 也會調用停止減速的方法

是以: 以後要判斷UIScrollView是否停止滾動, 需要同時重寫兩個方法

    2.1scrollViewDidEndDragging

    2.2scrollViewDidEndDecelerating

縮放:

要想縮放圖檔分為兩步

    1.成為代理, 通過代理方法告訴UIScrollView要縮放哪一個子控件

    2.設最大置子控件和最小的縮放比例

}

// 因為UISrollView中可能有多個子控件

// 那麼UISrollView就搞不清楚到底要縮放哪一個子控件

// 想要縮放, 必須明确的告訴UISrollView要縮放哪一個控件

/**************************縮放代理方法***********************************/

綜合案例:

在iOS開發中UIScrollView使用最多的地方也就是結合pageControl實作頁面的輪播,比如新特性或者廣告還有一些就是關于圖檔浏覽什麼的。

1:在StoryBoard中搭建界面并且設定輸出口

2:ViewDidiLoad方法中初始化子控件(UIImageView)設定相應的圖檔

// Do any additional setup after loading the view, typically from a nib.

1 CGFloat width = self.sc.frame.size.width; 2 3 CGFloat height = self.sc.frame.size.height; 4 5  

// 1.初始化子控件, 添加圖檔

3:設定UIScrollView和pageControl對應的屬性

1 self.sc.showsHorizontalScrollIndicator = NO; 2 3 self.sc.showsVerticalScrollIndicator = NO; 4 5  

// 2.設定滾動範圍

// 3.監聽PageControl的點選事件

//:設定pageControl對應每個點顯示的圖檔,在這裡因為是私有屬性是以使用KVC來實作,正好用到了前面我們剛學到的KVC,如果不懂情檢視相關文章()

4.通過KVC給UIPageControl的私有屬性指派, 設定自定義圖檔

5:設定代理并且實作代理方法,在代理方法裡面實作UIScrollView的與PageControl同步滾動(使用四舍五入法進行中線變化的bug)

// 隻要滾動就會調用

6:當我們有時候可能會的點選pageControl上面的點,是以有的時候也會希望能點選對應的點直接到對應的界面,可以直接使用UIScrollView的屬性contentOfSet設定。

在StoryBoard中為pageControl設定一個Action并且實作一下代碼

#pragma mark - 内部監聽

7:既然是做一個完整的小項目,我們就要根據大部分App的需求,比如我們經常見到的廣告會自動滾動,新特性同樣也可以實作這個功能,而且在使用者能夠看完上面的内容的情況下自動到下一張效果會跟好,這樣使用者就不需要操作什麼,下面就來實作一下自動滾動的效果,

這裡使用的是NSTimer定時器

1)聲明一個NSTimer屬性

// 注意:NSTimer應該是weak

// 為什麼NSTimer應該是weak, 因為隻要建立一個NSTimer對象, 該對象就會被主線程強引用

1 @property (weak, nonatomic) NSTimer *timer; 

2)定義一個公共開啟定時器的方法,這裡使用的是NSRunLoop實作一個常見的bug(使用者做其他操作圖檔還是同意滾動),關于NSRunLoop後面的關于多線程的文章中将會詳細介紹。

#pragma mark - 定時器相關

在ViewDidLoad中調用這個方法,是的應用程式進來就會實作滾動,

NStimer實作定時的時候會自定定時的調用我們下面的方法實作頁面的跳轉:

// 切換到下一頁

3)同樣實作一個關閉定時器的公共方法。

4)最後有兩個地方需要注意的是,可能甚至一定回去對界面有一些相應的操作,而我們要做的就是在使用者操作的同時實作圖檔的滾動不受任何影響除非是對UIScrolView做一些操作,是以我們要根據使用者相應的操作實作定時器的關閉與打開,這裡我隻是在拖拽或者觸摸的時候實作這個功能,

最後的效果

在後面的文章中我們會講到三個UI中最難(其實也不難,隻是相對)的控件:UITableView,UICollection,UIStackView,其中後面兩個可以非常簡單的實作上面的功能,幾行代碼就搞定。

屬性與方法總結:

本文轉自ljianbing51CTO部落格,原文連結:http://blog.51cto.com/ljianbing/1794537 ,如需轉載請自行聯系原作者