iOS開發-自定義重用機制給ScrolleView添加子視圖

其實這個問題我很早就想過,只是沒有通過去敲代碼實現,昨天有人提起,我就巧了一下

不知道大家打印郭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    

在來兩張圖片


啟動模擬器的時候.png

啟動模擬器的時候.png

滑動到底部的時候.png

可以看到內存是沒有變得,所以這個思路我想還是正確的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,067評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,467評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,468評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,184評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,582評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,794評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,343評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,096評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,291評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,513評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,941評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,190評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,026評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,253評論 2 375

推薦閱讀更多精彩內容