iOS开发-UIScrollView原理

转载:http://www.cnblogs.com/xiaofeixiang/p/5144256.html

UIScrollView 在开发中是不可避免,关于UIScrollView都有自己一定的理解。滚动视图有两个需要理解的属性,frame和bounds,frame是定义了视 图在窗口的大小和位置,bounds表示视图在其自身坐标系中的位置和大小,frame影响视图在窗口位置,bounds会影响子视图的位置。

先来看一张图片:

我们用一个父View将整个窗口铺满,然后添加子视图:

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];redView.backgroundColor = [UIColor redColor];UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(160, 150, 150, 180)];greenView.backgroundColor = [UIColor greenColor];UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(60, 400, 200, 150)];blueView.backgroundColor = [UIColor blueColor];UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(180, 600, 180, 200)];yellowView.backgroundColor = [UIColor yellowColor];[self.container addSubview:redView];[self.container addSubview:greenView];[self.container addSubview:blueView];[self.container addSubview:yellowView];UILabel *desc=[[UILabel alloc]initWithFrame:CGRectMake(150, 20, 200, 20)];[desc setText:@"博客园-FlyElephant"];[desc setFont:[UIFont systemFontOfSize:14]];[desc setTextAlignment:NSTextAlignmentCenter];[self.container addSubview:desc];[self.view addSubview:self.container];

重新设置Bounds:

    CGRect bounds=self.container.bounds;bounds.origin=CGPointMake(0, 200);self.container.bounds=bounds;

效果如下:

通过设置Bounds可以让视图向上移动,那么我可以通过手势简单的定义UIScrollView:

@interface  FEScrollView()@property (assign,nonatomic) CGSize contentSize;@end@implementation FEScrollView-(instancetype)initWithFrame:(CGRect)frame{self=[super initWithFrame:frame];if (self) {UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];[self addGestureRecognizer:panGesture];}return self;
}-(void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecongnizer{CGPoint translation = [panGestureRecongnizer translationInView:self];CGRect bounds = self.bounds;CGFloat newBoundsOriginY = bounds.origin.y - translation.y;bounds.origin.y=newBoundsOriginY;self.bounds = bounds;[panGestureRecongnizer setTranslation:CGPointZero inView:self];
}
@end

效果如下:

UIScrollView是可以设置ConteSize的,我们也可以设置,并控制滑动的范围:

-(void)handlePanGesture:(UIPanGestureRecognizer *)panGestureRecongnizer{CGPoint translation = [panGestureRecongnizer translationInView:self];CGRect bounds = self.bounds;//需要设置contentsizeCGFloat newBoundsOriginX = bounds.origin.x - translation.x;CGFloat minBoundsOriginX = 0.0;CGFloat maxBoundsOriginX = self.contentSize.width - bounds.size.width;bounds.origin.x = fmax(minBoundsOriginX, fmin(newBoundsOriginX, maxBoundsOriginX));CGFloat newBoundsOriginY = bounds.origin.y - translation.y;CGFloat minBoundsOriginY = 0.0;CGFloat maxBoundsOriginY = self.contentSize.height - bounds.size.height;bounds.origin.y = fmax(minBoundsOriginY, fmin(newBoundsOriginY, maxBoundsOriginY));self.bounds = bounds;[panGestureRecongnizer setTranslation:CGPointZero inView:self];
}

UIScrollView实际上比我们实现的要复杂很多反弹效果,动量滚动,放大试图以及涉及到的代理方法,本文就是简单介绍一下原理,实际开发中如非特殊的必要,没必要继承UIView去实现UIScrollView。如果对UIScrollView有特殊需求,倒是可以继承UIScrollView实现自己的功能~

转载于:https://www.cnblogs.com/xiaofei76/p/5536966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算如何实现海量IoT数据就地处理

1.什么是IoT边缘?Gartner数据显示,到2021年底将有超过50%的大型企业部署至少一个边缘计算应用;到2023年底,50%以上的大型企业将至少部署6个用于物联网或沉浸式体验的边缘计算应用。工业一体机的售价一般在1…

《鸿蒙理论知识02》HarmonyOS开发平台和工具

目录 1.应用和开发工具的演进 2.超 级 终 端 应 用 开 发 面 临 全 新 挑 战

用Lucene建立搜索索引

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以…

twitter api_Java应用程序上的Twitter API

twitter api是否曾想过将推文附加到Java应用程序? 我为此寻找了最好的API,很幸运,我找到了它! http://twitter4j.org/ 一个简单的方法: 我们需要做的第一件事是在您的Twitter帐户中创建一个应用程序,为其授…

垂直和水平装饰

装饰器模式是在不更改其接口的情况下向对象添加功能的最佳方法之一。 我经常使用可组合装饰器,并且总是会问自己在功能列表必须可配置时如何正确设计它们。 我不确定我的答案是否正确,但是这里有一些值得深思的地方。 公寓(1960)…

cygwin配置git

对于windows用户来说,使用git bash经常会出现乱码情况,那么一款优质高尚的软件,值得推荐一下了,那就是cygwin 下载cygwin后,在安装过程中,安装git,安装vim编辑器 然后会在安装目录下看到类linux…

前端代码规范网址导航(总结)

在大公司代码规范是非常重要的一件事情,多人协作,还有代码评审。所以能写出漂亮的代码非常重要。 这就好比你自己在家,无论是穿大裤衩子,还是背心,甚至是光膀子,都没人管你。但你要出门去约会,就要把最好的一面展现给别人。这是对别人的尊重,也是给自己的背书。所以遵…

JLupin Next Server乍一看

JEE基础结构现在有了一个新的管理解决方案– JLupin Next Server。 它为应用程序实现提供了另一种方法。 它提供什么? 用于实现JEE应用程序的现有解决方案受到限制。 通过新的应用程序管理方式,JLupin Next Server打破了所有障碍。 JEE的足迹 良好实践…

读《第一次把事情做对》有感

上班的时候,领导在群里发了一个PDF书籍《第一次把事情做对》,被这个书籍名称吸引住了,因为作为程序员每天有开发新任务,解决旧任务的BUG,第一次就把事情做的完全正确几乎不可能呀,觉得很有看的必要&#xf…

做了三年前端,你才知道10分钟就能实现一个PC版魔方游戏

导读:最近手头有点紧,看到很多小朋友都在玩魔方,又没有money买,只能自己用JavaScriptcss实现一个,在电脑端就能开启魔方之旅。 目录 项目启动演示 项目目录 ​源码地址 项目启动演示 前端使用JavaScript和纯CSS实现…

15K的前端应届毕业生,就因为掌握了这些知识点!(前端企业级开发必备)

目录 1.前端开发 下载安装VScode 优化配置 2、插件安装 3、设置字体大小 4、开启完整的Emmet语法支持 5、视图 2.Node.js 入门 2.1、什么是Node.js 2.2、Node.js有什么用 2.3、安装 下载: 2.4、快速入门 2.5、服务器端应用开发 3、ES6入门 3.2、let声…

[Training Video - 1] [Selenium Basics] [Download and Install Selenium]

Download Selenium Jars Configure jars in eclipse Webdriver http://docs.seleniumhq.org/download/ Selenium RC http://code.google.com/p/selenium/downloads/detail?nameselenium-remote-control-1.0.3.zip&can2&q转载于:https://www.cnblogs.com/MasterMonkInT…

【0元试用微软 Azure人工智能认知服务】这个人脸识别功能太强大啦

导读:这个由美丽的客服小姐姐提前申请好了企业试用的账号,个人的话还得需要visa卡。 官网地址:azure.cn 登录地址:portal.azure.cn 目录 1.简介 2.Azure 认知服务是什么? ​ 3.认知服务的四种职能 4.人脸API 5.新建一…

OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分

1.简介 在上一教程中,我们看到了MapHandler如何将各种组件连接在一起(更具体地说,是从MapHandlerChild派生的类)。 我们看到了如何以编程方式执行此操作,但是还有另一种声明性地使用openmap.properties 。 样本OpenMa…

《javaScript100例|01》超级经典一套鼠标控制左右滚动图片带自动翻滚

目录 HTML示例 图片示例 HTML示例 <html > <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>超级经典一套鼠标控制左右滚动图片带自动翻滚</title> <style type"text/css&quo…

[BZOJ1007] [HNOI2008] 水平可见直线 (凸包)

Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的. 例如,对于直线:L1:yx; L2:y-x; L3:y0 则L1和L2是可见的,L3是被覆盖的. 给出n条直线,表示成yAxB的形式(|A|,|B|<500000),且n条直线两…

《javaScript100例|02》超级经典一套鼠标控制左右滚动图片带自动翻滚

目录 效果图 JS示例 源码地址&#xff1a; 效果图 JS示例 <title>JavaScript切换图片</title> <script> function showDaTu(src){ document.getElementById("defaultImg").srcsrc; } </script> <img src"wall1.jpg" id"…

抽象工厂设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

《javaScript100例|03》自写javaScript+CSS轮显效果

目录 效果图 代码示例 源码地址&#xff1a;自写JsCSS轮显效果.rar-互联网文档类资源-CSDN下载https://download.csdn.net/download/weixin_41937552/37380520 效果图 代码示例 <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equ…

《javaScript100例|04》自动播放——Js幻灯片缓冲效果

目录 效果图 示例 源码地址&#xff1a; 效果图 示例 <html> <head> <title>自动播放——幻灯片缓冲效果</title> <style> body,div,ul,li{margin:0;padding:0;} ul{list-style-type:none;} body{background:#000;text-align:center;font:12p…