当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS-UIScrollView内容复用【实现两个试图的复用】

iOS-UIScrollView内容复用【实现两个试图的复用】

2018年04月17日  | 移动技术网IT编程  | 我要评论

我爱萨隆邪铁的清香,尸王横行,邰丽华简介

前言

这里说的内容复用,是指添加到 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中的信息
    ///更新信息处理
 }

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网