UIScrollView 回顧

在最美的年齡,為最初的夢想,盡最大的努力!

做iOS開發(fā)有段時間了,后來因為公司的要求,轉了前端的開發(fā),回過頭來再溫習iOS有了不同的感觸,寫文章還是第一次,希望通過簡書來記錄一個菜鳥程序員的成長。

UIScrollVIew 知識總結

  • scrollView 常用屬性
//監(jiān)控目前滾動的位置
CGPoint contentOffSet
//滾動范圍的大小
CGSize contentSize
//視圖在scrollView中的位置
UIEdgeInsets contentInset
//設置協(xié)議
id<UIScrollerViewDelegate>delegate
//控制控件遇到邊框是否反彈
BOOL bounces
//控制垂直方向遇到邊框是否反彈
BOOL alwaysBounceVertical
//控制水平方向遇到邊框是否反彈
BOOL alwaysBounceHorizontal
//控制控件是否整頁翻動
BOOL pagingEnabled
//控制控件是否能滾動
BOOL scrollEnabled
//控制是否顯示水平方向的滾動條
BOOL showsHorizontalScrollIndicator
//控制是否顯示垂直方向的滾動條
BOOLshowsVerticalScrollIndicator
//指定滾動條在scrollerView中的位置
UIEdgeInsets scrollIndicatorInsets
//設定滾動條的樣式
UIScrollViewIndicatorStyleindicatorStyle
//縮小的最小比例
float minimumZoomScale
//放大的最大比例
float maximumZoomScale
//設置變化比例
float zoomScale
//控制縮放的時候是否會反彈
BOOL bouncesZoom
//判斷控件的大小是否正在改變
BOOL zooming
//控制控件滾動到頂部 
BOOL scrollsToTop
  • scrollView 常用代理方法
//滑動時觸發(fā)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 
//捏合時觸發(fā)                          
- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
//將要開始拽動時觸發(fā)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
//將要結束拖拽時觸發(fā)
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
//已經結束拖拽時
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
//拖拽結束會有個慣性減速過程,這個過程即將開始時觸發(fā)
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;  
//慣性結束時
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
//非人為托轉,代碼控制scroll滑動動畫結束時觸發(fā)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; 
//返回一個可以進行捏合的view  (必須是scroll的子控件)
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;  
//將要開始進行捏合操作事觸發(fā)
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view 
//結束捏合時觸發(fā)
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale; 
//是否可以滑到頂部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;  
//滑動到頂部時
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;   

UIScrollVIew 實現(xiàn)輪播圖

想想以前面試官問你怎么寫輪播圖,我還很裝逼的說5123451思路制造假象實現(xiàn)跳轉輪播,現(xiàn)在想想,真是 too young too simple,于是我自己試著封裝了一個利用三個UIImageVIew 思路 進行無限輪播

實現(xiàn)思路:默認加載三張UIImageView,無論怎么滑動永遠顯示中間那張,每次滑動先渲染圖片在切換scrollView的contentOffSet到中間,造成無限循環(huán)的假象

  • 核心代碼

首先渲染三張圖片 最后一張 第一張 第二張,渲染后讓scrollView滑到中間圖片位置,然后向右滑動 到第二張的位置 渲染三張圖片為 第一張 第二張 第三張, 然后讓scrollVIew滑動到中間第二張的位置,依次類推,造成循環(huán)的假象!


#pragma mark  更新圖片 渲染
//渲染圖片的方法
- (void)updateImage{
    //始終讓中間的圖片顯示
    //圖片變換順序后 設置scrollView contentOffset 顯示中間
    for (int i = 0; i < COUNT; i++) {
        ZZHImageView * imageView = self.scrollView.subviews[i];
        NSInteger index = self.pageControl.currentPage;
        if(i == 0){ 
            index --;
        }else if (i == 2){
            index++;
        }
        if (index < 0) {
            //第一張的前一張是最后一張
            index = self.imageArr.count - 1;
        } else if (index >= self.imageArr.count) {
            //最后一張的的后一張是第一張
            index = 0;
        }
        //把index賦給imageView  起到媒介作用, 后面拿到tag 就是pageControl的index
        imageView.tag = index;
        imageView.image = [UIImage imageNamed:self.imageArr[index]];
    }
//跳轉到中間圖片位置
    self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width, 0);
}

在scrollViewDidScroll方法中獲取滑動結束后停留在最中間位置的UIImageView, 就是當前顯示的圖片。


#pragma mark - UIScrollviewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //找到位于最中間的imageView;
    //scroll滾動時 判斷三個圖片的x與scrollView的contentOffset的x 的絕對值最小的就是即將停在最中間的imageView
    NSInteger page = 0;
    CGFloat minDistance = MAXFLOAT;
    for (int i = 0; i<COUNT; i++) {
        ZZHImageView *imageView = self.scrollView.subviews[i];
        CGFloat distance = ABS(imageView.frame.origin.x - scrollView.contentOffset.x);
        if (distance < minDistance) {
            minDistance = distance;
            //拿到中間位置的tag 設置 pageControl 的currentPage
            page = imageView.tag;
        }
    }
//當前是第幾張圖片
    self.pageControl.currentPage = page;
}
//手動拖拽結束后重新渲染
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self updateImage];
}
//定時器 動畫結束后重新渲染
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
    [self updateImage];
}

Demo地址( https://github.com/heiheiLqq/ZZHBannerDemo )

UIScrollVIew 實現(xiàn)相冊圖片放大縮小功能

通常我們看到的類似相冊捏合放大縮小圖片的功能也是用scrollView做的

  • 一個簡單的例子

//在scrollView中添加一個UIImageView
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"我是圖片"]];
[self.scrollview addSubview:imageView];
 self.imageView = imageView;
//設置捏合的形變最大值最小值
self.scrollview.maximumZoomScale = 2.0;
self.scrollview.minimumZoomScale = 0.2;

//在代理方法設置進行可以進行捏合的控件,必須是scrollView的子控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}
//用戶捏合過程中會走一下的代理方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
  //被捏合控件的形變值
  NSLog(@"縮放ing-----%f", scrollView.zoomScale);
  //圖片縮小放大的時候圖片不會居中,在該方法中設置圖片中心點
  self.imageView.center=self.scrollview.center
}

UIScrollView無法滾動的解決辦法

  • 沒有設置contentSize
  • scrollEnabled = NO
  • 沒有接收到觸摸事件:userInteractionEnabled = NO

這波總結先到這作為程序員我還是個小白,其實最常用的UITableView和UICollectionView ,準備接下來兩天在自己總結下,第一次在簡書上寫文章,希望像記筆記一樣記錄一下自己的成長,希望大家多多支持!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,704評論 4 61
  • 我沒問你過得好不好 不代表你不重要 而是,我想你,卻沒有對你說 我希望被你需要,在你想找人說話的時候,在你失眠的時...
    5bbdb32c24aa閱讀 571評論 0 0
  • 我一直都相信一句話,那就是:你是什么樣,你就得到什么樣的福報。這正是我寫這篇偽評論文的初衷,我已經做好了被口水淹沒...
    人間有味駱大清歡閱讀 501評論 0 0
  • 這篇文章發(fā)于2017/03/08 “第七島”原創(chuàng)公眾號 現(xiàn)在在“簡書”補充發(fā)布 我將與shasha(我的小老板)一...
    Sun渣婷閱讀 431評論 0 0
  • 這些天我一直在想,如果有人問我,你最渴望變?yōu)槭裁礃樱視趺椿卮穑?這個問題,我也很想問問你們。你最渴望變成什么樣...
    櫻桃七閱讀 487評論 3 3

友情鏈接更多精彩內容