UIScrollView分页滑动宽度小于320的实现


UIScrollView是滚动条,它可以垂直,水平滚动。这个要设置 contentSize来实现,设置高度或者宽度。
  如果属性pageEnabled = YES,则设置其为分页模式,那么每滚动一次就是一页,垂直方向上的一页就是UIScrollView的高度,水平方向就是其宽度。
  我们可以设置contentSize,这就是UIScrollView可以滚动的最大区域了。
  UIScrollView没有datasource的概念,因为这就是一个view,具体view中的内容摆放完全随意,只是每次都会滚动固定的页面大小。
  比如我们有5个页面,我们需要自己计算每个页面的位置,将其水平放在UIScrollView上。
  contentSize则设置为5*每个页面的宽度,每个页面的高度。
  如果contentSize的高度或这宽度正好与UIScrollView的高度或宽度相等,则在该方向上不能滚动。
  具体例子可以查看官方文档的例子,PageControl。
  注意:UIScrollView不会带有分页的指示符号,需要利用UIPageControl控制。
  但是要想做到safari的效果,我们需要一个小技巧,因为在safari中,当前页时可以看到前后两页的部分内容。
实现的效果如图: UIScrollView分页滑动宽度小于320的实现


   注意:分页的宽度不能修改,所以我们只能缩小UIScrollView的宽度,让其不要占满整个屏幕,同时设置clipsToBouds属性为NO(这个是关键,如果没有设置这个属性为NO,那么边缘超出UIScrollView控件宽度的内容不会显示出来),这 样超出范围的视图也会显示,这样就能看到前后两页的内容,当然需要设置前后两页的alpha值为0.5,做出一个透明效果。
  在UIScrollView的滚动事件中,判断位置,当一个页面出现的区域超过1半时,设置alpha为1,小于1半时设置alpha为0.5
以下是扩展性内容:(不影响图的大致效果,加上更佳)
   现在还有一个问题:UIScrollView的滑动事件响应区域变小了,因为UIScrollView本身变小了,其余我们看到的页面在区域之外,因此 我们需要重写UIScrollView所在的parentView的hittest事件,在其他区域的事件返回值为UIScrollView对象,这样用 户感觉整个屏幕都是UIScrollView在响应了。

补充说明:

当时我在做这个东西的时候搜到的写的最详细的文章就是这个了,不过对于最后的hittest事件一直是知其然而不知其所以然。现在分享一下我关于hittest的一些认识。

当UIScrollView的滑动事件响应区域变小的时候,右侧就会留下一块不响应scrollview事件的矩形区域,因此,可以在自定义的scrollview类里重写hitTest函数。代码如下:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(CGRectMake(280,0,40,460), point)) {
return self;
}
return [super hitTest:point withEvent:event];
}

最后参考:官方文档UIScrollView的相关属性和内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值