转载: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

iOS开发-UIScrollView原理相关推荐

  1. iOS开发UIScrollView的底层实现

    起始 做开发也有一段时间了,经历了第一次完成项目的激动,也经历了天天调用系统的API的枯燥,于是就有了探索底层实现的想法. 关于scrollView的思考 在iOS开发中我们会大量用到scrollVi ...

  2. iOS开发·runtime原理与实践: 基本知识篇

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! 摘要:这篇文章首先介绍runtime原理,包括类,超类,元类,super_class,is ...

  3. IOS开发UIScrollView控件详解

    首先实现UIScrollViewDelegate协议: [plain] view plaincopy #import <UIKit/UIKit.h> @interface Activity ...

  4. iOS 开发-文件下载原理

    文件上传 创建文件上传类FileDownload.h // // FileDownload.h // 01.文件下载 // // Created by wyh on 15-1-29. // Copyr ...

  5. [iOS开发]@autoreleasepool原理探究

    自动释放池 自动释放池 @autoreleasepool 最常见的地方就是我们项目的 main函数 .我们今天来深入探索下其底层结构和实现原理.先查看一下编译后的情形: int main(int ar ...

  6. iOS开发 -- UIScrollView 仿京东金融首页效果

    京东金融效果如下: 代码地址:https://github.com/bybyWind/ImitateJDjrApp.git 先搭建三个UIScrollVIew: @property(nonatomic ...

  7. 唐巧的《iOS开发进阶》 - 读后感

    2019独角兽企业重金招聘Python工程师标准>>> 唐巧的<iOS开发进阶> - 读后感 为什么要看书 为什么要多看书呢? 在技术类书籍上,看书的目的,不是为了记住所 ...

  8. 读iOS开发进阶有感

    花了两天时间, 零零散散看完了这本书.总的来说, 比较失望吧. 花点时间记录下. 第一次看到这本书, 是在看唐巧大神博客的时候看到的  ---------->  <iOS开发进阶>即 ...

  9. 【原】iOS开发进阶(唐巧)读书笔记(二)

    第三部分:iOS开发底层原理 1.Objective-C对象模型 1.1 isa指针 NSObject.h部分代码: NS_ROOT_CLASS @interface NSObject <NSO ...

最新文章

  1. matlab 绘图3
  2. IMDB是否提供API? [关闭]
  3. 我的SQL SERVER数据库会装满吗?
  4. Java Spring Beans.xml里的Bean定义是如何被解析出来的
  5. 博客园博客PDF生成器
  6. 内置函数——filter和map
  7. infopath视图切换
  8. 解决方案 | MySQL DBA主从复制出错怎么办?
  9. php smarty ci,CI整合Smarty,cismarty_PHP教程
  10. 剑指offer——面试题29:数组中出现次数超过一半的数字
  11. 按钮、菜单的重绘代码
  12. 聚类-----高斯混合模型
  13. win10命令行查看显卡驱动版本_Win10更新显卡驱动提示尝试重启GeForce Experience的解决方法...
  14. 番茄助手在VS2017中的设置
  15. C++学习足迹---(纯DOS版)五子棋
  16. 微信小程序开发(7)---协同工作篇
  17. 如何绘制深度神经网络图
  18. python中pillow是什么意思_Python-pillow
  19. 北宋三衙的地位、待遇及其政治作用
  20. 新能源与自动驾驶汽车市场

热门文章

  1. 计算机知识小技巧,计算机知识---基本操作小技巧.pptx
  2. c语言中Gretchen函数的功能,听过很多的歌的音乐达人给我推荐一下
  3. c语言文件的读写通讯录,学C三个月了,学了文件,用C语言写了个通讯录程序
  4. 独占线程太多怎么办_电脑内存被占用太多怎么办?
  5. crntos7启动php命令_CentOS7设置php-fpm开机自启动
  6. python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区
  7. python程序设计之文件_Python程序设计之文件操作(2)
  8. 光端机的分类有哪些?
  9. 二层和三层工业交换机的主要参数说明
  10. 工业交换机:如果出现了物理性故障该怎么判断?