前言
最近因为工作项目中需要用到uiscrollview嵌套uitableview嵌套交互问题,顺便网上搜了下的demo,发现实现的效果并不是很理想,滑动偶尔会有延迟现象,所以自己想了个办法,顺便把自己实现写了个demo分享出来,一起来看看吧。
实现过程
最底部放置的为一个uiscrollview,设置scrollview的contentsize属性,使可以发生横向滚动,同时隐藏横向滚动条,设置代理为当前控制器本身。然后,在最底部的uiscrollview上放置2个uitableview,因为只有2个所以没有考虑重用问题,如果数量大于3个建议写下uiscrollview子视图的重用。最后在最上面覆盖一个topview,使得它可以和tableview发生纵向滚动,为了实现最上面的topview可以随着tableview发生一起滚动,需要在tableview的scrollviewdidscroll代理方法中获取tableview的contentoffset偏移量,随便改变topview的frame。
当手势点开始落在从topview上时候,在controller的loadview方法中设置自定义view,通过在自定义view中重载hittest方法,判断是否需要让tableview进行交互。此时需要注意的是因为有自定义的左右选择segmentcontrol,这么设置的时候segmentcontroller是不会相应点击方法的。为了让segmentcontroller可以实现随着tableview滚动并且可以相应单击事件,我在在controller的view上添加了单击手势,判定是否点击在了自定义的segmentcontroll上(因为tableview本身不会相应- (void)touchesbegan:(nsset<uitouch *> )touches withevent:(uievent )event
事件,所以也可以自定义一个tablevuew,重载touchbegin 等方法,然后把tableview继承自这个tableview, 这样就可以相应相应的touchbegin等方法了), 好了,下面直接上代码
controller中代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#pragma mark - 底部的scrollviuew的代理方法scrollviewdidscroll - ( void )scrollviewdidscroll:(uiscrollview *)scrollview { cgfloat placeholderoffset = 0; if (self.topview.getselecteditemindex == 0) { if (self.firsttableview.contentoffset.y > self.topview.height - kitemheight) { placeholderoffset = self.topview.height - kitemheight; } else { placeholderoffset = self.firsttableview.contentoffset.y; } [self.secondtableview setcontentoffset:cgpointmake(0, placeholderoffset) animated:no]; } else { if (self.secondtableview.contentoffset.y > self.topview.height - kitemheight) { placeholderoffset = self.topview.height - kitemheight; } else { placeholderoffset = self.secondtableview.contentoffset.y; } [self.firsttableview setcontentoffset:cgpointmake(0, placeholderoffset) animated:no]; } } |
1
2
3
4
5
6
7
|
#pragma mark - 底部的scrollviuew的代理方法scrollviewdidenddecelerating - ( void )scrollviewdidenddecelerating:(uiscrollview *)scrollview { nsinteger index = ceilf(scrollview.contentoffset.x / kscreen_width); self.topview.selecteditemindex = index; } |
controller中view的代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#pragma mark - 重载系统的hittest方法 - (uiview *)hittest:(cgpoint)point withevent:(uievent *)event { viewcontroller *currentvc = (viewcontroller *)self.nextresponder; currentvc.printpoint = point; if ([self.topview pointinside:point withevent:event]) { self.scrollview.scrollenabled = no; if (self.scrollview.contentoffset.x < kscreen_width *0.5) { return self.firsttableview; } else { return self.secondtableview; } } else { self.scrollview.scrollenabled = yes; return [super hittest:point withevent:event]; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#pragma mark - 添加手势的相应方法 - ( void )tapgestureaction:(uitapgesturerecognizer *)gesture { cgpoint point = [gesture locationinview:self.topview]; if (cgrectcontainspoint(self.topview.leftbtnframe, point)) { if (self.scrollview.contentoffset.x > 0.5 * kscreen_width) { [self.scrollview setcontentoffset:cgpointmake(0, 0) animated:no]; self.topview.selecteditemindex = 0; } } else if (cgrectcontainspoint(self.topview.rightbtnframe, point)) { if (self.scrollview.contentoffset.x < 0.5 * kscreen_width) { [self.scrollview setcontentoffset:cgpointmake(kscreen_width, 0) animated:no]; self.topview.selecteditemindex = 1; } } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#pragma mark - firsttableview的代理方法scrollviewdidscroll - ( void )scrollviewdidscroll:(uiscrollview *)scrollview { cgfloat placeholderheight = self.topview.height - self.topview.itemheight; cgfloat offsety = scrollview.contentoffset.y; if (offsety >= 0 && offsety <= placeholderheight) { self.topview.y = -offsety; } else if (offsety > placeholderheight) { self.topview.y = - placeholderheight; } else if (offsety <0) { self.topview.y = - offsety; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#pragma mark - secondtableview的代理方法scrollviewdidscroll - ( void )scrollviewdidscroll:(uiscrollview *)scrollview { cgfloat placeholderheight = self.topview.height - self.topview.itemheight; cgfloat offsety = scrollview.contentoffset.y; if (offsety >= 0 && offsety <= placeholderheight) { self.topview.y = -offsety; } else if (offsety > placeholderheight) { self.topview.y = - placeholderheight; } else if (offsety <0) { self.topview.y = - offsety; } } |
完整项目下载地址如下:https://github.com/maxzhang123/nestscrollview
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.jianshu.com/p/c51665f7f48b