事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下

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

在来两张图片

启动模拟器的时候

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

滑动到中间的时候

滑动到最后一个的时候

iOS开发-自己定义重用机制给ScrollerView加入子视图的更多相关文章

  1. iOS开发之--TableViewCell重用机制避免重复显示问题

    常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复 // 这样配置的话超过页面显示的内容会重复出现 - (UITableViewCell *)tableView:(U ...

  2. iOS - UITableView中Cell重用机制导致Cell内容出错的解决办法

    "UITableView" iOS开发中重量级的控件之一;在日常开发中我们大多数会选择自定Cell来满足自己开发中的需求, 但是有些时候Cell也是可以不自定义的(比如某一个简单的 ...

  3. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  4. iOS开发——高级技术&签名机制

    签名机制 最近看了objc.io上第17期中的文章 <Inside Code Signing> 对应的中文翻译版 <代码签名探析> ,受益颇深,对iOS代码签名机制有了进一步的 ...

  5. IOS中UITableViewCell的重用机制原理

    创建UITableViewController子类的实例后,IDE生成的代码中有如下段落: - (UITableViewCell *)tableView:(UITableView *)tableVie ...

  6. iOS开发自己定义键盘回车键Return Key

    在iOS开发中.用户在进行文本输入的时候,往往会用到虚拟键盘上的回车键,也就是Return Key.回车键有时候能够是"完毕"(表示输入结束).能够是"下一项" ...

  7. ios UITableView中Cell重用机制导致内容重复解决方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的 UITableViewCell,可以让UITableViewCell响应一些点 ...

  8. iOS开发之线程间的MachPort通信与子线程中的Notification转发

    如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...

  9. IOS开发-通知与消息机制

    在多数移动应用中不论什么时候都仅仅能有一个应用程序处于活跃状态.假设其它应用此刻发生了一些用户感兴趣的那么通过通知机制就能够告诉用户此时发生的事情. iOS中通知机制又叫消息机制,其包含两类:一类是本 ...

随机推荐

  1. angular2之pdf文件操作大全

    最近的项目中需要显示pdf内容.下载pdf.甚至是前端生成pdf 适用于angular2.4或者更高版本 情景1.需要将页面的某个部分转成pdf文件并下载(即将页面的部分html内容转成pdf文件) ...

  2. Python 40 数据库-约束

    约束 1.什么是约束 ? 除了数据类型以外额外添加的约束 2.为什么要使用约束 ? 为了保证数据的合法性 完整性 分类: 1.not null 非空约束,数据不能为空----------------- ...

  3. Python27天 反射 ,isinstance与ssubclass 内置方法

    所学内容 反射 1.hasattr ( 判断一个属性在对象里有没有 ) -------------------- [对象,字符串属性]本质是:# 判断 ' name ' in obj.__dict__ ...

  4. Vue项目打包部署到apache服务器

    vue项目在开发环境下,让项目运行起来,是通过npm run dev命令,原理是在本地搭建了一个express服务器. 但是在服务器上就不是这样的,必须要通npm run build命令来对整个项目进 ...

  5. Spring的AOP机制---- AOP的注解配置---- AOP的注解配置

    3333隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约隐隐约约噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢 ...

  6. 【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)

    C. Journey time limit per test3 seconds memory limit per test256 megabytes inputstandard input outpu ...

  7. Spring Boot (13) druid监控

    druid druid是和tomcat jdbc一样优秀的连接池,出自阿里巴巴.除了连接池,druid哈hi有一个很实用的监控功能. pom.xml 添加了以下依赖后,会自动用druid连接池替代默认 ...

  8. bootstrap表格样式

    一:表格基本格式 <table> <tr> <th>标题一</th> <th>标题二</th> </tr> < ...

  9. Excel常用的小技巧

    1.Excel如何实现单元格内轻松换行:按住ALT+enter就可以了. 2.Excel固定表头:在“视图”>冻结窗口>冻结首行. 3.防止电脑突然断电,导致正在编辑的Excel数据丢失, ...

  10. Ad hoc polymorphism

    与面向对象中的接口类或抽象类中定义的函数组类似: 函数的具体执行依赖与函数医用的类型. In programming languages, ad-hoc polymorphism[1] is a ki ...