contentsize、contentoffset 和contentInset 详解

本文通过构建一个互动式书架应用,详细解释了contentsize、contentoffset和contentInset这三个关键概念的作用与区别。以实际代码为例,展示如何运用这些概念来实现滚动视图的布局与交互效果。

下面我用怎么做一个书架的例子和大家说说contentsize、contentoffset 和contentInset的区别。

NSString *path = nil; UIImage *back = nil; NSString *str = nil; UIImage *aImage = nil; path = [[NSBundle mainBundle] pathForResource:@"shujia" ofType:@"jpg"]; back = [UIImage imageWithContentsOfFile:path];//加载图片 _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(96, 84,back.size.width,back.size.height)]; _scrollView.showsVerticalScrollIndicator = NO; //将竖直方向的滚动条隐藏 //将shujia.jpg作为_scrollerView的背景 UIColor *color=[[UIColor alloc]initWithPatternImage:back]; [_scrollView setBackgroundColor:color]; _buttonList=[NSMutableArray arrayWithCapacity:9]; for(int i=0;i<9;i++) { str=[NSString stringWithFormat:@"menubook%d",i+1]; path = [[NSBundle mainBundle] pathForResource:str ofType:@"png"]; aImage = [UIImage imageWithContentsOfFile:path]; int x = (i%3)* (aImage.size.width+15); int y = (i/3)* (aImage.size.height+30); _whichPeople = [UIButton buttonWithType:UIButtonTypeCustom]; _whichPeople.frame = CGRectMake(x+10,y+30,aImage.size.width,aImage.size.height); _whichPeople.tag = i; [_whichPeople setImage:aImage forState:UIControlStateNormal];//这个图片是在布点击时响应 path = nil; aImage = nil; str = nil; str=[NSString stringWithFormat:@"menubook%d_1",i+1]; path = [[NSBundle mainBundle] pathForResource:str ofType:@"png"]; aImage = [UIImage imageWithContentsOfFile:path]; [_whichPeople setImage:aImage forState:UIControlStateHighlighted];//图片在点击的时候响应 [_whichPeople addTarget:self action:@selector(ButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [_scrollView addSubview:_whichPeople]; [_buttonList addObject:_whichPeople]; path = nil; aImage = nil; str = nil; } //控制可以滚动的区域 _scrollView.contentSize = CGSizeMake(480, 580); //当前显示区域顶点相对于frame顶点的偏移量 _scrollView.contentOffset = CGPointMake(0, 0); //scrollview的contentview的顶点相对于scrollview的位置 _scrollView.contentInset = UIEdgeInsetsMake(0 , 0, 0, 0); [self.view addSubview:_scrollView];

contentSize是scrollview可以滚动的区域,比如frame = (0 ,0 ,320 ,480) contentSize = (320 ,960),代表你的scrollview可以上下滚动,滚动区域为frame大小的两倍。
contentOffset是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentoffset就是(0 ,480),也就是y偏移了480
contentInset是scrollview的contentview的顶点相对于scrollview的位置,例如你的contentInset = (0 ,100),那么你的contentview就是从scrollview的(0 ,100)开始显示

在 Vue.js 中,`this.$bus` 通常是一个事件总线对象,用于在组件之间进行事件的发布订阅。要监听 `content-size-changed` 事件并获取传递的 `width`、`height`、`scale` `offset` 数据,可以按照以下步骤操作: ### 监听事件 在需要监听事件的组件中,使用 `this.$bus.$on` 方法来监听 `content-size-changed` 事件,并在回调函数中获取传递的数据。示例代码如下: ```javascript export default { created() { this.$bus.$on('content-size-changed', (data) => { const { width, height, scale, offset } = data; // 在这里可以使用获取到的数据进行相应的操作 console.log('Width:', width); console.log('Height:', height); console.log('Scale:', scale); console.log('Offset:', offset); }); }, beforeDestroy() { // 为了避免内存泄漏,在组件销毁前移除事件监听器 this.$bus.$off('content-size-changed'); } } ``` 在上述代码中,`created` 钩子函数会在组件实例被创建之后立即调用,在这个钩子函数中使用 `this.$bus.$on` 监听 `content-size-changed` 事件。当事件触发时,回调函数会接收到传递的数据对象 `data`,通过解构赋值可以获取到 `width`、`height`、`scale` `offset`。 `beforeDestroy` 钩子函数会在组件实例销毁之前调用,在这个钩子函数中使用 `this.$bus.$off` 移除事件监听器,以避免内存泄漏。 ### 触发事件 在触发事件的地方,使用 `this.$bus.$emit` 方法触发 `content-size-changed` 事件,并传递包含 `width`、`height`、`scale` `offset` 的对象。示例代码如下: ```javascript // 触发事件并传递数据 this.$bus.$emit('content-size-changed', { width: 100, height: 200, scale: 1.5, offset: { x: 10, y: 20 } }); ``` ### 总结 通过以上步骤,就可以使用 `this.$bus` 监听 `content-size-changed` 事件并获取传递的 `width`、`height`、`scale` `offset` 数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值