什麼是UIScrollView
- 移動裝置的螢幕大小是極其有限的,是以直接展示在使用者眼前的内容也相當有限
- 當展示的内容較多,超出一個螢幕時,使用者可通過滾動手勢來檢視螢幕以外的内容
- 普通的UIView不具備滾動功能,不适合顯示過多的内容
- UIScrollView是一個能夠滾動的視圖控件,可以用來展示大量的内容,并且可以通過滾動檢視所有的内容
UIScrollView的基本使用
- UIScrollview的用法很簡單
- 将需要的展示的内容添加到UIScrollView中
- 設定contentsize屬性,也就是可以滾動的範圍
- 注意
- 超出UIScrollerView邊框的内容會被自動隐藏
- 使用者可以用手勢拖動來檢視超出邊框被隐藏的内容
UIScrollerView無法滾動的解決方法
- 如果UIScrollView無法滾動,可能是以下原因:
- 沒有設定contentSize
- scrollEnabled = NO
- 沒有接收到觸摸事件:userInteractionEnabled = NO
UIScrollView的常見屬性
@property(nonatomic) CGPoint contentOffset;
//這個屬性用來表示UIScrollView滾動的位置(其實就是内容左上角與scrollView左上角的間距值)
@property(nonatomic) CGSize contentSize;
//這個屬性用來表示UIScrollView内容的尺寸,滾動範圍(能滾多遠)
@property(nonatomic) UIEdgeInsets contentInset;
//這個屬性能夠在UIScrollView的4周增加額外的滾動區域,一般用來避免scrollView的内容被其他控件擋住
UIScrollerView的其他屬性
- @property(nonatomic) BOOL bounces;
- //設定UIScrollView是否需要彈簧效果
- @property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
//設定UIScrollView是否能滾動
- @property(nonatomic) BOOL showsHorizontalScrollIndicator;
//是否顯示水準滾動條
- @property(nonatomic) BOOL showsVerticalScrollIndicator;
//是否顯示垂直滾動條
UIScrollView的常用代理方法(delegate)
- 很多時候,我們想在UIScrollView正在滾動 或 滾動到某個位置 或者 停止滾動 時做一些特定的操作
- 要想完成上述功能,前提條件就是能夠監聽到UIScrollView的整個滾動過程
- 當UIScrollView發生一系列的滾動操作時, 會自動通知它的代理(delegate)對象,給它的代理發送相應的消息,讓代理得知它的滾動情況
- 也就是說,要想監聽UIScrollView的滾動過程,就必須先給UIScrollView設定一個代理對象(任意類型),然後通過代理得知UIScrollView的滾動過程
UIScrollerViewDelegate協定
// 使用者開始拖拽時調用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// 滾動到某個位置時調用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
// 使用者結束拖拽時調用
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
UIScrollerView和控制器
- 一般情況下,就設定UIScrollView所在的控制器 為 UIScrollView的delegate
- 設定控制器為UIScrollView的delegate有2種方法:
- 通過代碼(self就是控制器)
- self.scrollView.delegate = self;
- 通過storyboard拖線(右擊UIScrollView)
- 然後,控制器應該遵守UIScrollViewDelegate協定
- 最後,實作協定中定義的相關方法
UIScrollView的縮放
内容縮放
- 有些時候,我們可能要對某些内容進行手勢縮放,如下圖所示
- UIScrollView不僅能滾動顯示大量内容,還能對其内容進行縮放處理
- 也就是說,要完成縮放功能的話,隻需要将需要縮放的内容添加到UIScrollView中
UIScrollerView的縮放原理
- 當使用者在UIScrollView身上使用捏合手勢時,UIScrollView會給代理發送一條消息,詢問代理究竟要縮放自己内部的哪一個子控件(哪一塊内容)
- 當使用者在UIScrollView身上使用捏合手勢時,UIScrollView會給代理發送一條消息,詢問代理究竟要縮放自己内部的哪一個子控件(哪一塊内容)
縮放實作步驟
- 設定UIScrollView的id delegate代理對象
- 設定minimumZoomScale :縮小的最小比例
- 設定maximumZoomScale :放大的最大比例
- 讓代理對象實作下面的方法,傳回需要縮放的視圖控件
(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
跟縮放相關的其他代理方法
(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
(void)scrollViewDidZoom:(UIScrollView *)scrollView
UIScrollView和UIPageControl的分頁
- 隻要将UIScrollView的pageEnabled屬性設定為YES,UIScrollView會被分割成多個獨立頁面,裡面的内容就能進行分頁展示
- 一般會配合UIPageControl增強分頁效果,UIPageControl常用屬性如下
//目前顯示的頁碼
@property(nonatomic) NSInteger currentPage;
//隻有一頁時,是否需要隐藏頁碼訓示器
@property(nonatomic) BOOL hidesForSinglePage;
//其他頁碼訓示器的顔色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
//目前頁碼訓示器的顔色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
//這個屬性用來表示UIScrollView滾動的位置(其實就是内容左上角與scrollView左上角的間距值)
@property(nonatomic) CGPoint contentOffset;
NSTimer的使用
- NSTimer叫做“定時器”,它的作用如下
- 在指定的時間執行指定的任務
- 每隔一段時間執行指定的任務
- 調用下面的方法就會開啟一個定時任務
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
//每隔ti秒,調用一次aTarget的aSelector方法,YesOrNo決定了是否重複執行這個任務