iOS開發-自己定義重用機制給ScrollerView加入子視圖

來源:互聯網
上載者:User

標籤:dex   copyright   can   img   ==   oid   back   view重用   art   

事實上這個問題我非常早就想過,僅僅是沒有通過去寫程式實現,昨天有人提起,我就巧了一下

不知道大家列印郭tableview:cellforrow中cell初始的次數,也就是重用池中的cell個數。這個是固定的,比方螢幕最多能夠顯示4個cell那麼重用池個數可能為5個6個或者7左右,我就想了假設scrollview去實現,子視圖也應該是有一個個數的,那麼怎樣去實現重用池呢?

我想到了數組,可變數組,我在loadview中將scrollview的可滑動地區設定為10000。然後給scrollview每隔20個距離加入一個view共10個,在for迴圈中將這10個view加入到數組arr中,那麼接下來怎麼做呢,我是這麼想的,當須要加入第11個時候,將第1個從數組中提出來。改變成第11個的frame。然後改變它到數組的最後一個,是不是就有了,相同假設上拉的時候怎麼顯示上一個呢?將數組的最後一個提出來。改變frame,然後改變它到數組的第一個位置。話說了這麼多。以下貼代碼吧。

////  ViewController.m//  ScollerView重用////  Created by monkeyheng on 8/5/15.//  Copyright (c) 2015 monkeyheng. All rights reserved.//#import "ViewController.h"@interface ViewController () <UIScrollViewDelegate>@property (nonatomic, strong) UIScrollView *scrollView;// 託管重用數組@property (nonatomic, strong) NSMutableArray *arr;// 須要加入到頭部子視圖的座標Y值@property (nonatomic, assign) CGFloat upY;// 須要加入到尾部子視圖的座標Y@property (nonatomic, assign) CGFloat downY;// 拖動時候的位移量@property (nonatomic, assign) CGFloat offset;@end@implementation ViewController- (void)loadView {    [super loadView];    // 初始化一個ScrollView 寬度為螢幕寬度 可滑動地區為10000    self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, 10000);    self.scrollView.backgroundColor = [UIColor redColor];    self.scrollView.delegate = self;    [self.view addSubview:self.scrollView];}- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    // 加入初始子視圖到Scrollview 共10個 能夠依據實際情況調控或者演算法調控    NSInteger i = 0;    for (i = 0; i < 10; i++) {        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, i * 100 +(i - 1) * 20, 375, 100)];        view.backgroundColor = [UIColor blueColor];        // 加入子視圖到scrollview        [self.scrollView addSubview:view];        // 加入view到託管的重用數組        [self.arr addObject:view];    }    // 下一個view的y點是    i++;    self.downY = i * 100 + (i - 1) * 20;    self.upY = -120;    self.offset = 0;}- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    // Dispose of any resources that can be recreated.}// 拖動開始的時候// scrollView 開始拖動- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{    // 記錄拖動開始的位移量    self.offset = scrollView.contentOffset.y;}- (void)scrollViewDidScroll:(UIScrollView *)scrollView {        // 推斷上下滑 是否位移量超出螢幕    if (scrollView.contentOffset.y < 0 || scrollView.contentOffset.y > (10000 - 667)) {        // 超出螢幕範圍不做不論什麼操作    } else if ((scrollView.contentOffset.y - self.offset) > 0) {        // 開始滑動的位移量假設大於拖動的位移量 手指拖動螢幕上拉        // 上滑動        if ((self.downY - (self.scrollView.contentOffset.y + 667)) < 150) {            // 在尾部Y座標距離螢幕底部150的時候            // 取出數組的第一個元素            UIView *view = [self.arr objectAtIndex:0];            // 將頭部Y座標變為view的Y座標 由於view要加入到尾部            self.upY = view.frame.origin.y;            // 移除數組第一個元素            [self.arr removeObjectAtIndex:0];            // 改變view的frame            view.frame = CGRectMake(0, self.downY - 100 - 20, 375, 100);            // 將view又一次加入到數組            [self.arr addObject:view];            // 改變下一個的尾部座標的Y值            self.downY = self.downY + 100 + 20;                    }            } else if((scrollView.contentOffset.y - self.offset) < 0){        // 開始滑動的位移量假設大於拖動的位移量 手指拖動螢幕下拉        // 下滑動        if ((self.scrollView.contentOffset.y - self.upY) < 270) {            // 在頭部Y座標距離螢幕頂端270的時候--》即將加入的頭部view的尾部距離螢幕頭部150            // 取出數組的最後一個元素            UIView *view = [self.arr lastObject];            // 將尾部Y座標變為view的Y座標 由於view要加入到頭部部            self.downY = view.frame.origin.y;            // 移除數組最後一個元素            [self.arr removeObject:view];            // 改變view的frame            view.frame = CGRectMake(0, self.upY, 375, 100);            // 將view又一次加入到數組的頭部            [self.arr insertObject:view atIndex:0];            // 改變下一個的頭部座標的Y值            self.upY = self.upY - 100 - 20;        }    }}#pragma mark 懶載入- (UIScrollView *)scrollView {    if (_scrollView == nil) {        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];    }    return _scrollView;}- (NSMutableArray *)arr {    if (_arr == nil) {        _arr = [[NSMutableArray alloc] init];    }    return _arr;}@end
在來兩張圖片

啟動模擬器的時候

滑動到中間的時候

滑動到最後一個的時候

iOS開發-自己定義重用機制給ScrollerView加入子視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.