当前位置: 首页 > 编程日记 > 正文

iOS开发-自己定义重用机制给ScrollerView加入子视图

iOS开发-自己定义重用机制给ScrollerView加入子视图

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

不知道大家打印郭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 宽度为屏幕宽度 可滑动区域为10000self.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的frameview.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的frameview.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
在来两张图片

启动模拟器的时候

滑动到中间的时候

滑动到最后一个的时候

posted on 2017-05-30 13:12 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/6920234.html

相关文章:

2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

附件题&#xff1a;Webshell密码 题目描述&#xff1a; 某次攻防演练中&#xff0c;抓到了一个webshell的流量&#xff0c;请分析出密码&#xff0c;flag形式&#xff1a;flag{密码} 附件下载&#xff1a; https://download.csdn.net/download/qpeity/33675356https://downlo…

关于python3与python2同时存在情况下导入pyqt失败解决记录

最近感觉tkinter功能还是比较不适合新手做出高大上的界面&#xff0c;故开始使用pyqt&#xff0c;通过pip安装好了之后&#xff0c;利用qt设计师设计好界面之后&#xff0c;cmd运行之&#xff0c;报错提示没有找到pyqt5模块&#xff0c;IDE运行能正常加载 查找资料后发现&#…

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas&#xff1a;多地图SLAM这篇博客ORBSLAM-Altas这个系统系统方法两类子地图新地图的构建相机位姿的可观测性子地图融合系统线程结尾这篇博客 最近ORB-SLAM3横空出世&#xff0c;马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这…

Android驱动学习-内部机制_回顾binder框架关键点

内部机制_回顾binder框架关键点server注册服务时, 对每个服务都提供不同的ptr/cookie,在驱动程序里对每个服务都构造一个binder_node, 它也含有ptr/cookie client使用服务前要先getService&#xff1a;会在驱动程序里对该服务构造一个binder_ref, binder_ref含有desc, node成员…

数据库--事务

我们知道数据库中的SQL语句分为DDL(数据定义语言)、DQL(数据查询语言)、DML(数据操纵语言)、DCL(数据控制语言)&#xff0c;详情请看SQL语句 当数据库的表中数据执行完添加、删除、和修改等数据操纵语言&#xff08;DML&#xff09;后&#xff0c;需要执行commit(提交)数据控制…

2021年中国工业互联网安全大赛核能行业赛道writeup之传统流量取证

附件题&#xff1a;传统流量取证 题目描述&#xff1a; 在某次攻防演练中&#xff0c;小王发现流量探针平台突然告警&#xff0c;小王第一时间下载了告警流量包&#xff0c;并进行分析&#xff1a;发现攻击队攻击在攻入内网后&#xff0c;利用了一个内网OA的一个漏洞&#xff…

ORB-SLAM3 论文笔记

ORB-SLAM3 论文笔记这篇博客ORB-SLAM3系统相机模型的抽象(Camera Model)重定位的问题图片矫正的问题视觉惯性SLAM的工作原理相关公式IMU初始化跟踪和建图系统对跟踪丢失的应对多地图的闭环检测和地图融合位置识别视觉地图融合方法视觉惯性地图的融合方法单个地图中的闭环融合结…

为什么需要 外键 呢?

生活现象&#xff1a; 不知你们是否遇到过这样的现象&#xff0c;就是你辛辛苦苦花了几十块钱注册一个会员&#xff0c;结果家里的七大姑&#xff0c;八大姨都要拿去用&#xff0c;而且完全可以用。还有就是一个淘宝账号里却可以添加好多个收获地址(里面包括收货人的姓名&#…

JavaScript闭包函数箭头函数调用与执行

一、标准的闭包函数 //一、标准的闭包函数 function A() {var i0;i;console.log(i : i);return function b() {return function c() {return i}} }var a A(); // 初始化A&#xff0c;执行A内的非function语句 ‘ i0; i‘&#xff0c;输出 I : 1 console.log(a()); // 执行fu…

jlink api sdk c# 离线数获取 标定

jlink 如何 离开 keil、IAR 监控变量呢&#xff1f; 目前 jlink的 api 可以做到&#xff0c;自己可以用C# 做一个 上位机&#xff0c;监控RAM里面的变量。而不用打开keil 调试。还可以 刷写 flash&#xff0c;可以用在产品量产的刷写上。SEGGER 的 jlink sdk并不是免费的&…

2021年中国工业互联网安全大赛核能行业赛道writeup之usb流量分析

目录 一、USB协议 二、键盘流量 三、鼠标流量 四、writeup 附件题&#xff1a;usb流量分析 题目描述&#xff1a; 具体描述忘记了o(╯□╰)o 大概意思是有个U盘插到电脑上&#xff0c;然后经过一些操作导致该电脑重启了。找到这个过程中的flag。 附件下载&#xff1a; 20…

BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)

BOS项目 第2天 今天内容安排&#xff1a; 1、根据提供的pdm文件生成sql 2、持久层和表现层设计---BaseDao、BaseAction 3、实现用户登录功能 4、jQuery EasyUI 消息提示控件 5、jQuery EasyUI menubutton菜单按钮 6、自定义struts2拦截器&#xff0c;实现用户未登录自动跳转到…

服务器 主动 推送 客户端浏览器 消息***

前言 通常情况下&#xff0c;无论是web浏览器还是移动app&#xff0c;我们与服务器之间的交互都是主动的&#xff0c;客户端向服务器端发出请求&#xff0c;然后服务器端返回数据给客户端&#xff0c;客户端浏览器再将信息呈现&#xff0c;客户端与服务端对应的模式是: 客户端请…

数据库表(字段类型、约束、截断表、修改表字段、重命名表)

字段类型&#xff1a; 在这里只列举一些常用的字段类型&#xff1a; 整数类型:int(Integer):普通大小的整数 小数类型&#xff1a; float(m,d)&#xff1a;单精度浮点数&#xff0c;m表示数字长度&#xff0c;d表示小数位数&#xff0c;例如float(5,2)最大值999.99double(m,d…

(转载)动态SLAM系统:VDO-SLAM!

动态SLAM系统&#xff1a;VDO-SLAM&#xff01;这篇博客是转载 计算机视觉life 公众号中的文章。这篇文章是对VDO-SLAM论文的全文翻译&#xff0c;是 &#xff01;&#xff01;真人工翻译&#xff01;&#xff01;不是机器翻译&#xff0c;我看了之后觉得挺好&#xff0c;所以分…

2021年中国工业互联网安全大赛核能行业赛道writeup之入门的黑客

附件题&#xff1a;入门的黑客 题目描述&#xff1a; 在某次工控攻防演练中&#xff0c;防守方使用蜜罐捕捉到了某黑客在入侵时留下的恶意程序样本&#xff0c;现在要对该黑客进行画像&#xff0c;需要从该恶意程序中分析出反连时的IP和端口信息&#xff0c;看看聪明的你能否能…

一种视觉惯性+激光传感器的SLAM系统

一种视觉惯性激光传感器的SLAM系统这篇博客论文摘要一些假设和标注系统总览VI 里程计扫描匹配&#xff08;scan matching&#xff09;优化提高系统鲁棒性的措施闭环检测和临近检测全局位姿图优化总结这篇博客 这篇论文“Robust High Accuracy Visual-Inertial-Laser SLAM Syste…

抽象类和接口的联系与区别

抽象类和接口联系与区别 关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制&#xff0c;正是由于这两种机制的存在&#xff0c;才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具…

P1132 数字生成游戏

题目描述 小明完成了这样一个数字生成游戏&#xff0c;对于一个不包含00的数字ss来说&#xff0c;有以下33种生成新的数的规则&#xff1a; 将ss的任意两位对换生成新的数字&#xff0c;例如143143可以生成314,413,134314,413,134&#xff1b;将ss的任意一位删除生成新的数字&a…

MySQL02-升级

MySQL 版本号由三个数字和可选后缀组成&#xff0c;形式 mysql-x.y.z-suffix。比如 mysql-5.7.21 或者 mysql-5.7.34。 x(5)这位是大版本y(7)这位是小版本&#xff0c;大版本小版本组合成 5.7 就是一个发行版最后一位是bugfix release版本&#xff0c;从1逐渐增加&#xff0c;…

Kinect V1读取图像数据(For Windows)

Kinect V1读取图像数据&#xff08;For Windows&#xff09;这篇博客Kinect V1介绍数据读取的基本流程运行代码和注释结尾这篇博客 刚好有一台现成的Kinect V1相机&#xff0c;所以就拿过来学习一下它的数据读取方式和编程方法&#xff0c;毕竟它还能用于跑RGBD-SLAM。Kinect V…

1.IocDI和Spring

1.面向对象回顾和案例 面向对象程序设计&#xff1a;1 2 3 4 案例分析&#xff1a; 需求分析&#xff1a; 报表功能&#xff1a; 报表服务类&#xff0c;检索数据&#xff0c;并生成图标 报表生成器类&#xff0c;生成不同格式的报表文件&#xff0c;例如PDF格式、Html…

MySQL之模糊查询

先在MySQL数据库里创建一个表&#xff0c;并添加几条数据&#xff1a; create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa…

rsync工具

rsync工具一、介绍1、可以实现 本地数据 《----------》 远程数据/本地数据 的传输2、两种通信方式&#xff08;man rsync&#xff09;&#xff08;1&#xff09;remote shell&#xff08;一个冒号&#xff1a;&#xff09;&#xff0c;通过sshd协议传输&#xff08;2&#xf…

2021年中国工业互联网安全大赛核能行业赛道writeup之日志分析

附件题&#xff1a;日志分析 题目描述&#xff1a; 核电站新来的运维小王粗心把一个办公网地址映射到外网&#xff0c;遭到大量攻击&#xff0c;你能从日志当中找到有效信息吗。 附件下载&#xff1a; 2021-10-12T15_37_51.61064600_00rizhifenxi.rar-网络攻防文档类资源-CSD…

【POJ1509】Glass Beads 【后缀自动机】

题意 给出一个字符串&#xff0c;求它的最小表示法。 分析 这个题当然可以用最小表示法做啦&#xff01;但是我是为了学后缀自动机鸭&#xff01; 我们把这个字符串长度乘二&#xff0c;然后建SAM&#xff0c;然后在SAM上每次跑最小的那个字母&#xff0c;找出长度为n的时候就停…

order by总结

先在MySQL数据库里建一个表&#xff0c;并添加几条数据&#xff1a; create table student(id char(36) primary key,name varchar(8) not null,age int(3) default 0,mobile char(11),address varchar(150) ) insert into student values (9b4435ec-372c-456a-b287-e3c5aa23…

Gazebo构建小车模型并通过ROS控制

Gazebo构建小车模型并通过ROS控制介绍编写车子的URDF文件编写控制小车移动的插件(与ROS交互)结尾介绍 突然想试试Gazebo这款仿真软件&#xff0c;因为它可以让你在任何时候都有机器人玩。但Gazebo的机制也比较复杂&#xff0c;所以还是先学习一下如何搭一个简单的小车&#xff…

【杂项】SVN服务器的本地搭建和使用

转载于:https://www.cnblogs.com/haizhibin1989/p/6939025.html

编译vim-8.2并配置jedi-vim插件

目录 一、背景 二、编译vim-8.2 三、配置jedi-vim插件 3.1、安装插件vundle 3.2、用vundle安装jedi-vim插件 一、背景 CentOS 7.9上已经安装了anaconda&#xff0c;python3.7的虚拟环境webenv。现在编译安装vim-8.2&#xff0c;使之支持python3&#xff08;yum装包是不支…