UIScrollView的滑动原理解析

  • 顾名思义,UIScrollView 就是负责滚动的视图
  • 移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限
  • 当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容
  • 普通的 UIView 不具备滚动功能,不能显示过多的内容
  • UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容
  • iOS 开发中几个重要的控件都继承自 UIScrollView
  • UITableView 表格视图
  • UICollectionView 集合视图
  • UITextView 文本视图

代码创建ScrollView和UIImageView

// ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    // 设置scrollview大小为全屏 375*667(4.7吋屏幕)
    scrollView.frame = self.view.bounds;
    [self.view addSubview:scrollView];

    // 创建imageview对象,并且初始化的时候指定大小为图片的大小
    UIImageView *imageView  = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ab179aaejw1f44f5h8np9j23402c0kjl"]];
    [scrollView addSubview:imageView];

    // 设置可滚动范围为图片的大小
    scrollView.contentSize = imageView.image.size;
    // 设置界面刚显示出的时候,图片自带偏移
    scrollView.contentOffset = CGPointMake(0, -64);
    // 设置top留白64
    scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);


}
@end
由代码可知,ScrollView的大小与屏幕相等,为375*667
  • 下图中:UIImageView上图片的大小690*518

UIImageView上图片的大小680*518

  • ScrollView没有滑动前的数据
    • Bounds: X:0 Y:-64 W:375 H:667
    • Position: X: 187.5 Y:333.5

ScrollView没有滑动前的数据

  • UIImageView没有滑动前的数据
    • Bounds: X:0 Y:0 W:690 H:518
    • Position: X: 345 Y:259

UIImageView数据

  • ScrollView向左滑动后的数据
    • Bounds: X:77 Y:-64 W:375 H:667
    • Position: X: 187.5 Y:333.5

ScrollView滑动后的数据

  • UIImageView向左滑动后的数据
    • Bounds: X:0 Y:0 W:690 H:518
    • Position: X: 345 Y:259

UIImageView滑动后数据

滑动总结:

  • 利用视图层次结构观察滚动后的 scrollView 和 imageView 的 position(center) 和 bounds 的变化
  • 对比滑动前后的数据,只有ScrollView的bounds中的x发生了改变
  • 滚动过程中 scrollView 本身的 frame 并没有发生变化
  • 滚动过程中 imageView 本身的 frame 也没有发生变化
  • 滚动过程中 scrollView 的 bounds 的 (x, y) 发生了变化

so.经过多次的验证,滑动只会改变ScrollView的bounds
既通过改变ScrollView自身的原点来改变子控件的位置
注:bounds我们通常用于修改大小,如果修改了x,y对自身不会发生什么影响
只会影响子物体所参照的父对象原点,默认原点是自身的左上角,修改bounds的x,y后自身原点会发生位移,x,y都大于0的时候,向左上角方向移动,与frame恰好相反

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zok93

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值