IOSday05 UIScrollView使用

UIScrollView使用的步驟

  • 1.建立UIScrollView
    • 2.將須要展現的內容添加到UIScrollView中
    • 3.設置UIScrollView的滾動範圍 (contentSize)
    • 4.添加兩個子控件到UIScrollView中
    • 5.一個控件沒有設置frame, 默認x/y就是0

scrollView不能滾動的幾種狀況

1.沒有設置contentSize
 2.scrollEnabled屬性 = NO
 3.userInteractionEnabled屬性 = NO

enabled和userInteractionEnabled的區別

1. enabled: 表明控件不可用
 2. userInteractionEnabled: 表明控件不能夠和用戶交互, 也就是不能響應用戶的操做

如何去掉滾動條

  1. self.scrollView.showsHorizontalScrollIndicator = NO;
  2. self.scrollView.showsVerticalScrollIndicator = NO;
  3. 滾動條也是scrollView的子控件的一部分
  4. 滾動條可能在子控件的前面, 也可能在子控件的後面
  5. 正是由於這個緣由, 因此之後在開發中不推薦你們經過subviews獲取子控件的方式來操做子控件

[self.scrollView.subviews lastObject];oop


設置滾動條的樣式

self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;ui

  1. 默認狀況下UIScrollView有一個回彈效果,只要設置了contentSize就有回彈效果

self.scrollView.bounces = YES;atom

  1. 設置默認是否有回彈效果 (默認就是沒有設置contentSize的狀況)
    垂直方向能夠回彈
  2. 下拉刷新

self.scrollView.alwaysBounceVertical = YES;線程

  1. 哪怕沒有設置contentSize也能夠有回彈效果

self.scrollView.alwaysBounceHorizontal = YES;代理


設置內容偏移位(contentOffset)

  1. 其實就是設置scrollView滾動到什麼地方
  2. 告訴scrollView x方向要移動多少, y方向要移動多少
  3. 若是x是正數: 圖片往左邊移動
  4. 若是x是負數: 圖片往右邊移動
  5. 同理y是正數: 圖片往上移動
  6. 同理y是負數: 圖片往下移動
    7. 計算公式: 永遠都是以 控件的左上角 – 內容的左上角

sc.contentOffset = CGPointMake(100, 0);code

8. 注意點:contentOffset移動的位置是一個臨時的位置, 只要輕輕拖拽一下就會回到默認的位置

2.設置滾動範圍

self.sc.contentSize = CGSizeMake(IMAGE_COUNT * width, height);orm

self.sc.contentSize = CGSizeMake(width, IMAGE_COUNT * height);對象

self.sc.bounces = NO;繼承

self.sc.pagingEnabled = YES;事件

pagingEnabled實現分頁的本質, 是按照UIScrollView的寬度或者高度來分頁的
UIScrollView的寬度就是一頁的寬度


UIScrollViewDelegate

  • 如何監聽一個控件的變化/狀態
    • 1.首先須要查看該控件的頭文件, 看它繼承於誰
    • 1.1若是繼承於UIControl, 那麼就能夠經過addTarget來監聽
    • 1.2若是繼承於UIView, 那麼必須經過代理來監聽
  • 代理協議的規律:
    • 以控件的類名開頭, 後面加上delegate
    • 代理協議中的方法名的規律:
    • 通常以控件名稱去掉類前綴開頭
    • 代理協議中的方法參數的規律:
    • 誰觸發事件, 就將誰傳遞進來
  • 如何監聽UIScrollView的變化
    • 1.成爲UIScrollView的代理
    • 2.遵照UIScrollView的協議
    • 3.實現UIScrollView協議中的方法

      代理做用:

    • 當A對象想監聽B對象的變化 , 那麼可讓A成爲B的代理
    • 當B對象發生一些變化想通知A對象, 那麼可讓A成爲B的代理
      self.sc.delegate = self;

    • 只要成爲了UIScrollView的代理, 遵照代理協議, 實現協議中的方法
      當UIScrollView發生一些變化的時候, 系統就會自動調用這些代理方法

    - scrollViewDidScroll方法何時調用?
    - 只要UIScrollView滾動了, 系統就會自動調用

    - scrollViewWillBeginDragging
    • 只要用戶準備開始拖拽了就會調用

- (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

  • 每次調用 中止拖拽方法時 ,系統都會傳入一個當前是否有慣性的參數
    咱們能夠判斷該參數是否爲YES, 若是是YES表明當前UIScrollView有慣性, 中止拖拽並不會中止滾動, 須要在中止減速方法中監聽何時真正的中止

UIScrollView已經中止減速了

  • 只有執行了這個方法才表明UIScrollView已經中止滾動了

- (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView

注意:

  • 若是想在UIScrollView中止滾動以後作一些操做, 有兩種狀況
    • 1.沒有慣性的狀況: 只會調用 中止拖拽的方法, 不會調用中止減速的方法
    • 2.有慣性的狀況: 既會調用 中止拖拽的方法, 也會調用中止減速的方法
      • 因此: 之後要判斷UIScrollView是否中止滾動, 須要同時重寫兩個方法

        scrollViewDidEndDragging

        scrollViewDidEndDecelerating


UIScrollView縮放

  • 要想縮放, 除了告訴UISrollView要縮放哪個控件之外, 還要告訴UISrollView最小能縮多小, 最大能放多大
```self.sc.maximumZoomScale = 2.0;```

   ``` self.sc.minimumZoomScale = 0.5;想要縮放, 必須明確的告訴UISrollView要縮放哪個控件
  • 要想縮放圖片分爲兩步
    • 1.成爲代理, 經過代理方法告訴UIScrollView要縮放哪個子控件
    • 2.設最大置子控件和最小的縮放比例
  • 想要縮放, 必須明確的告訴UISrollView要縮放哪個控件
    - 由於UISrollView中可能有多個子控件
    • 那麼UISrollView就搞不清楚到底要縮放哪個子控件
    • 在此方法中告訴UISrollView要縮放哪個控件

    - (nullable UIView *)viewForZoomingInScrollView:(nonnull UIScrollView *)scrollView { return self.iv; }

  • 和scrollViewDidScroll同樣, 只要縮放一點點就會調用

    - (void)scrollViewDidZoom:(nonnull UIScrollView *)scrollView { NSLog(@"%s", __func__); }

  • 縮放結束時調用

    - (void)scrollViewDidEndZooming:(nonnull UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale { NSLog(@"%s", __func__); }


#UIScrollView的輪播

self.sc.pagingEnabled = YES;

pagingEnabled實現分頁的本質, 是按照UIScrollView的寬度或者高度來分頁的
UIScrollView的寬度就是一頁的寬度

pageControl

  • 設置未顯示的頁碼顏色

    self.pageControl.pageIndicatorTintColor = [UIColor blackColor];
  • 設置當前顯示的頁碼顏色

    self.pageControl.currentPageIndicatorTintColor = [UIColor purpleColor];
  • 設置當前頁碼

    self.pageControl.currentPage = currnetPage;
  • 經過KVC給UIPageControl的私有屬性賦值, 設置自定義圖片

    [self.pageControl setValue:[UIImage imageNamed:@"current"] forKeyPath:@"_currentPageImage"];

    [self.pageControl setValue:[UIImage imageNamed:@"other"] forKeyPath:@"_pageImage"];


NSTimer

  • NSTimer應該是weak, 由於只要建立一個NSTimer對象, 該對象就會被主線程強引用

    @property (weak, nonatomic) NSTimer *timer;

    scheduledTimerWithTimeInterval: 建立一個定時器, 而且當即但是計時

    TimeInterval: 間隔時間

    target: 調用誰的方法

    selector:調用什麼方法

    userInfo:須要傳遞什麼參數

    repeats: 是否重複
  • 若是給userInfo賦值, 那麼定時器調用的方法就必須接受參數, 而且接受的參數就是NSTimer
  • 只要調用scheduled方法建立一個NSTimer對象, 系統就會自動將NSTimer添加到主線程中

    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextPage:) userInfo:@" " repeats:YES];
  • 主線程在處理其它事件的時候, 分一點時間來處理NSTimer

    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

相關文章
相關標籤/搜索