文档章节

理解UIScrollView

人生天地间
 人生天地间
发布于 2014/05/11 20:13
字数 966
阅读 289
收藏 1
点赞 0
评论 0

     Coordinate Systems (系统坐标)

 每个视图都可以定义它自己的坐标。就像下面的图一样:

A standard x/y coordinate system with the x-axis pointing right and the y-axis pointing down

     一个UIView 的系统坐标

注意:这种逻辑坐标和并不在意视图的宽度和高度本身。它没有边界,可以无限向四个方向延伸。现在我们在这个坐标系中lay out 几个项目。每个彩色矩形代表一个子视图:

Four rectangles with different colors and sizes placed at different coordinates in the coordinate system

   添加子视图的坐标系

写下下面的代码:

   

   UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
   redView.backgroundColor = [UIColor colorWithRed:0.815 green:0.007 blue:0.105 alpha:1];
    UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(150, 160, 150, 200)];
    greenView.backgroundColor = [UIColor colorWithRed:0.494 green:0.827blue:0.129 alpha:1];
    UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(40, 400, 200, 150)];
    blueView.backgroundColor = [UIColor colorWithRed:0.29 green:0.564blue:0.886 alpha:1];
    UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(100, 600, 180, 150)];
    yellowView.backgroundColor = [UIColor colorWithRed:0.972 green:0.905 blue:0.109 alpha:1];
    [mainView addSubview:redView];
    [mainView addSubview:greenView];
    [mainView addSubview:blueView];
    [mainView addSubview:yellowView];

  Bounds

    在UIView的文档中是这样描述Bounds的性质的:The bounds rectangle … describes the view’s location and size in its own coordinate system.  A view can be considered a window or viewport into a rectangular area of the plane defined by its coordinate system(一个视图可以被认为是一个窗口或把它看成一个坐标系中确定的平面区域)   And the viewʼs bounds express the location and size of this rectangle.(和视图界限表达这个矩形的位置和大小。)。

      说我们的视图的边界矩形具有320 ×480点的宽度和高度,它的起源是默认的( 0 , 0 ) 。的角度的视口进入坐标系平面中,显示整个面的一小部分。范围之外的一切都还在那里,只是隐藏

   A viewport of 320 by 480 points provides a viewport into the coordinate system. Some of the rectangles are inside the viewport and some outside.

  视图提供了一个由坐标系定义的视图入口即可见区域。没有看见的只是没有被渲染出来,但是仍然存在。

Frame

   接下来我们修改边界矩形的原点:

   CGRect.boud = mainView.bounds;

  bounds.origin = CGPointMake(0,100);

  mainView.bounds = bouds;

  矩形的边界原点现在还在(0,100)所以我们看到的场景看起来还像下面一样:

The viewport has moved down by 100 points, making a different area of the coordinate system visible.

  修改矩形边界的原点,相当于改变viewport

他看起来好像移动了100point,这里就是体现了真实的坐标系。但是实际上你看到的是保持固定的屏幕,看起来坐标系并没有发生改变。

Animation illustrating the movement of the coordinate system caused by a change of the bounds origin

   修改边界矩形的原点是相当于移动的坐标系中的方向相反,而视图的位置保持固定,因为它的frame不会改变。

  而这正是UIScrollView的做,当它滚动。注意,从看来好像视图的子视图被移动的用户的角度看,虽然其在的观点而言的位置的坐标系统(换言之,它们的frame)保持不变。

   

Letʼs Build UIScrollView


       滚动视图并不需要不断更新其子视图的坐标,使其滚动。所有它做的是调整其边界的起源。有了这些知识,实现一个非常简单的滚动视图是微不足道的。我们建立了一个手势识别来检测用户的平移手势,并响应这个手势,将我们通过拖动的量转化成视图的界限:

    

// CustomScrollView.h
@import UIKit;
@interface CustomScrollView : UIView
@property (nonatomic) CGSize contentSize;
@end
// CustomScrollView.m
#import "CustomScrollView.h"
@implementation CustomScrollView
- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self == nil) {
        return nil;
    }
    UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] 
        initWithTarget:self action:@selector(handlePanGesture:)];
    [self addGestureRecognizer:gestureRecognizer];
    return self;}
    - (void)handlePanGesture:(UIPanGestureRecognizer *)gestureRecognizer{
    CGPoint translation = [gestureRecognizer translationInView:self];
    CGRect bounds = self.bounds;

    // Translate the view's bounds, but do not permit values that would violate contentSize   
    CGFloat 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;
    [gestureRecognizer setTranslation:CGPointZero inView:self];
    }
    
    @end

      就像真正的UIScrollView ,我们类有一个必须从外部设定来定义滚动区域的程度上contentSize属性。作为我们调整的范围,并确保这个值有效。

  下面是运行结果:

   Animated GIF showing our custom scroll view implementation

© 著作权归作者所有

共有 人打赏支持
人生天地间
粉丝 11
博文 46
码字总数 42083
作品 0
常州
程序员
IOS中scrollsToTop问题小结

scrollsToTop小结: UIScrollView是用来展示滚动的一个类。他有UITableView、UITextView等子类。 scrollsToTop是UIScrollView的一个属性,主要用于点击设备的状态栏时,是scrollsToTop == Y...

Daniel_s ⋅ 2016/04/29 ⋅ 0

iOS开发tips-UIScrollView的Autlayout布局

UIScrollViewj尽管继承于UIView,但它是一个相对比较特殊的视图,特别是当它遇到了AutoLayout之后。在UIScrollView中使用AutoLayout的目的除了使用相对约束确定子控件的位置和大小外,更重要...

jianxin160 ⋅ 2017/02/25 ⋅ 0

IOS中scrollsToTop问题小结

scrollsToTop小结: UIScrollView是用来展示滚动的一个类。他有UITableView、UITextView等子类。 scrollsToTop是UIScrollView的一个属性,主要用于点击设备的状态栏时,是scrollsToTop == Y...

Daniel_s ⋅ 2015/12/25 ⋅ 0

一个多UITableview的左右滑动简单解决方案

前言 本文源自实际开发中的需求,核心的要求有几个: 1、多个UITableview要支持左右滑动; 2、点击Tab也要有UITableview的滑动切换效果; 3、每个UITableview单独的下拉刷新和上拉加载; 效果...

落影loyinglin ⋅ 04/22 ⋅ 0

iOS解决方案:多个scrollview联动

前言 在移动应用实际开发过程中,往往会有多个scrollview嵌套的界面需求,这种需求已经司空见惯,解决方案也多种多样,这里就介绍一下我认为最优的解决方案。 效果图: Untitled.gif 结构解读...

indulge_in ⋅ 2017/05/27 ⋅ 0

IOS UIScrollView详解 & 图片缩放功能

一 UIScrollView 简介 UIScrollView是能滚动的视图控件,可以通过滚动的方式来展示类容。 二 UIScrollView常见属性 //设置UIScrollView滚动的位置@property(nonatomic) CGPoint contentOffse...

卧龙小 ⋅ 2015/01/05 ⋅ 2

01-UI基础-04-00-UIScrollView

继承关系 1、 基本概念 1.1 什么是UIScrollView 移动设备的屏幕大小是有限的,现在直接展示用户眼前的内容也相当有限 砀山是的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以为的...

口十耳 ⋅ 2016/01/04 ⋅ 0

iOS开发之UIScrollView代理

想在UIScrollView正在滚动或滚动到某个位置又或者停止滚动时做一些特定的操作,那么就需要监听UIScrollView的整个滚动过程,而当UIScrollView发生一系列的滚动操作时,会自动通知它的代理(d...

shenhuniurou ⋅ 2016/03/05 ⋅ 0

UIScrollView的常见属性和方法

二、UIScrollView 的常见属性 1、contentSize // default CGSizeZero @property(nonatomic) CGSize contentSize; 1.1 contentSize 的含义: 告诉 UIScrollView 要展示的内容实际有多大,也就是......

哪一种黑 ⋅ 2016/02/29 ⋅ 2

UIUIScrollView滚动视图与UIPageControl

1.UIScrollView概述 UIScrollView是所有滚动视图的基类,其子类有:UITableView,UITextView,父类为UIView,主要用于显示屏 幕显示不下 的图片,相册,文字,滚动条等等 2.UIScrollView常用属性 sc...

tuwangsheng ⋅ 2014/04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 10分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 22分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 55分钟前 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部