天天看點

iOS-UI控件-UIScrollView

什麼是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的滾動過程
    iOS-UI控件-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)
      iOS-UI控件-UIScrollView
    • 然後,控制器應該遵守UIScrollViewDelegate協定
      iOS-UI控件-UIScrollView
  • 最後,實作協定中定義的相關方法

UIScrollView的縮放

内容縮放

  • 有些時候,我們可能要對某些内容進行手勢縮放,如下圖所示
    iOS-UI控件-UIScrollView
  • UIScrollView不僅能滾動顯示大量内容,還能對其内容進行縮放處理
  • 也就是說,要完成縮放功能的話,隻需要将需要縮放的内容添加到UIScrollView中

UIScrollerView的縮放原理

  • 當使用者在UIScrollView身上使用捏合手勢時,UIScrollView會給代理發送一條消息,詢問代理究竟要縮放自己内部的哪一個子控件(哪一塊内容)
    iOS-UI控件-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決定了是否重複執行這個任務