iOS-UIScrollView內容復用【實現兩個試圖的復用】

来源:https://www.cnblogs.com/wangkejia/archive/2018/04/13/8818297.html
-Advertisement-
Play Games

前言 這裡說的內容復用,是指添加到 ScrollView 裡面的試圖是同一個模型;比如,我需要在 ScrollView 上添加100個 xkVIew(其他封裝好的VC、UIView),每次滑動 ScrollView 時,只需要更新 xkVIew 上的內容就行;ScrollView內容較多的情況下,可 ...


前言

這裡說的內容復用,是指添加到 ScrollView 裡面的試圖是同一個模型;比如,我需要在 ScrollView 上添加100個 xkVIew(其他封裝好的VC、UIView),每次滑動 ScrollView 時,只需要更新 xkVIew 上的內容就行;ScrollView內容較多的情況下,可以考慮復用。

最近做試卷排版,在做試卷展示時,我封裝好了一個基於VC的試題模型 PaperQuestionViewController(用於顯示每道試題的內容,模板里要加 index 索引屬性,便於復用),因為一套試卷,會有100+ 道試題,因為我的排版用到了 Coretext ,如果一下子把100+ 個試圖同時添加到ScrollView上,不復用,記憶體會比較大,這是復用最重要的原因;

實現

當前VC.m

///所有試題數組
@property (nonatomic,strong) NSArray *arrayQuestin;

///UIScrollView
@property (nonatomic,strong) UIScrollView *scrollview;

///保存可見的視圖
@property (nonatomic, strong) NSMutableSet *visibleViewControllers;

/// 保存可重用的
@property (nonatomic, strong) NSMutableSet *reusedViewControllers;

 引用 ScrollView 代理

<UIScrollViewDelegate>

實現代理方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    ///更新模板信息
    [self showVc];
}

附加方法

///顯示試圖
- (void)showVc{
    // 獲取當前處於顯示範圍的 控制器 索引
    CGRect visibleBounds = self.scrollview.bounds;
    CGFloat minX  = CGRectGetMinX(visibleBounds);
    CGFloat maxX  = CGRectGetMaxX(visibleBounds);
    CGFloat width = CGRectGetWidth(visibleBounds);
    NSInteger firstIndex = (NSInteger)floorf(minX / width);
    NSInteger lastIndex  = (NSInteger)floorf(maxX / width);
    
    // 處理越界
    if (firstIndex < 0) {
        firstIndex = 0;
    }
    if (lastIndex >= self.arrayQuestin.count) {
        lastIndex = (self.arrayQuestin.count - 1);
    }
    // 回收不在顯示 的
    NSInteger viewIndex = 0;
    for (PaperQuestionViewController * vc in self.visibleViewControllers) {
        viewIndex = vc.index;
        // 不在顯示範圍內
        if ( viewIndex < firstIndex || viewIndex > lastIndex) {
            [self.reusedViewControllers addObject:vc];
            [vc removeFromParentViewController];
            [vc.view removeFromSuperview];
        }
    }
    [self.visibleViewControllers minusSet:self.reusedViewControllers];
    // 是否需要顯示新的視圖
    for (NSInteger index = firstIndex; index <= lastIndex; index ++) {
        BOOL isShow = NO;
        for (BookPaperQuestionViewController * childVc in self.visibleViewControllers) {
            
            if (childVc.index == index) {
                isShow = YES;
            }
        }
        if (!isShow ) {
            [self showVcWithIndex:index];
        }
    }
}

// 顯示一個 view
- (void)showVcWithIndex:(NSInteger)index{
    PaperQuestionViewController *vc = [self.reusedViewControllers anyObject];
    if (vc) {
        [self.reusedViewControllers removeObject:vc];
        
    }else{
        PaperQuestionViewController *childVc = [[PaperQuestionViewController alloc] init];
        [self addChildViewController:childVc];
        vc = childVc;
    }
    CGRect bounds  = self.scrollview.bounds;//654
    CGRect vcFrame = bounds;
    vcFrame.origin.x = CGRectGetWidth(bounds) * index;
    vc.rectView = vcFrame;
    vc.index = index;
    vc.view.frame = vcFrame;
   
    // 最後在這個地方,更新模板VC中的信息
    ///更新信息處理
 }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • https://www.cnblogs.com/xqzt/p/4482888.html ...
  • [20180413]熱備模式相關問題2.txt--//上午測試熱備模式相關問題,就是如果打開熱備模式,如果中間的歸檔丟失,oracle在alter database end backup ;時並沒有應用日誌.--//雖然熱備份模式文件頭scn被"凍結",一定在某個地方記錄的檢查點的scn,這樣在執行 ...
  • 業務量增長到一定程度後,簡單的主從架構已經不能滿足業務需要,主庫的讀寫壓力增大,逐漸達到瓶頸,這時引入主從讀寫分離是一個不錯的選擇。本文介紹了實現讀寫分離的一款工具---Amoeba。 ...
  • net start mysql 無法啟動 1.可以進入MySQL的bin目錄下 mysql --remove 2.檢查一下自己的my.ini是否配置正確 [mysqld] #basedir代表自己MySQL的安裝根目錄basedir = D:\MySQL\mysql-5.7 #datadir代表自己 ...
  • 一、概要參考:https://docs.mongodb.com/getting-started/python/client/pymongo是python操作mongodb數據的第三方模塊,官方推薦使用;使用pymongo之前,首先安裝pymongo模塊,命令如下(使用pip安裝):pip insta... ...
  • [201804012]關於hugepages 3.txt--//有一段時間我一直強調安裝oracle一定要配置hugepage,因為現在的伺服器記憶體越來越大,如果還使用4K的頁面表,如果記憶體表占用記憶體巨大,--//特別連接數量很大的情況下,更加明顯,結果導致記憶體緊張,使用交換,這些類似的例子網上很多 ...
  • 一、經緯度表示方式 MongoDB 中對經緯度的存儲有著自己的一套規範(主要是為了可以在該欄位上建立地理空間索引)。包括兩種方式,分別是 Legacy Coordinate Pairs (這個詞實在不知道怎麼翻譯...) 和 GeoJSON 。 Legacy Coordinate Pairs Leg ...
  • 對象引用 NSCopying 代理 .h @interface xk : NSObject <NSCopying> @property (nonatomic, copy) NSString *string1; @property (nonatomic, copy) NSString *string2 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...