1
codeisjobs 2016-05-19 15:35:14 +08:00 via iPhone
手势吧,监听向上滑动的手势,再让它跟着一起动,没写过,不确定是不是这样实现的
|
2
gnouveau 2016-05-19 15:45:15 +08:00
在 tableView 的 `scrollViewDidScroll:`里调整那个 view 的 original
|
3
zhlooking OP @codeisjobs 如果要精细的确定滑动位移的多少就要用到 2 楼 @gnouveau 所说的'scrollViewDidScroll:'方法。可是这个时候 tableView 的 offsetY 已经改变了,就不是知乎的效果了。
|
4
chmlai 2016-05-19 16:43:47 +08:00
直接 KVO contentOffset
|
6
zhlooking OP |
7
l12ab 2016-05-19 17:49:14 +08:00
没下载在知乎,但根据你描述觉得是 tableview 的 header
|
8
misaka15 2016-05-19 17:52:36 +08:00
直接放在 tableView 中的 headerView
|
10
misaka15 2016-05-19 17:58:53 +08:00
@zhlooking 如果是这样的,那你只能楼上那个哥们说的那样,要么 KVO 监听 CotentOffset ,要么在 scrollViewDidScroll 里实现
|
11
a412739861 2016-05-19 18:03:08 +08:00
@zhlooking
在轮播的图片部分,上下滑动是无法滚动界面的,所以事件不会传到下面的 uitableview 。应该是平级的吧,倾向你说的那种,不过也没什么特别的意义吧? |
12
LINAICAI 2016-05-19 18:07:18 +08:00
。。。明显是 UIScrollView 下装了四个控制器的 view ,然后第一个 view 就是推荐的,上面放广告轮播图,下面放 tableView
|
13
zhlooking OP @misaka15 监听 ContentOffset 我尝试了,可是这个 TableView 的 contentOffset 并没有改变。
@a412739861 如果像我所说的是 UIScrollView 中嵌套了 UIScrollView 和 UITableView ,那么这些嵌套的手势又是如何区分开的?也就是我滑动 UITableView 的时候如何让 UIScrollView 来处理这个事件? |
14
wddwycc 2016-05-19 18:42:58 +08:00 via iPhone
contentInset 啊, Inset 出来的空间放轮播控件
|
15
zhlooking OP @wddwycc 就像 @a412739861 说的一样,不是 contentInset 也不是 headerView ,而是两个平级 scrollView 和 tableView 。问题是如何将对 tableView 的手势传递到下一层的 ScrollView 中去?
|
17
xxppxiaowei 2016-05-19 19:25:13 +08:00
不知道 IOS 里面如何实现的。。 web 里面一般都是自己捕捉手势 判断下面那个 scrollview 到顶端的 offset
|
18
a412739861 2016-05-19 19:47:21 +08:00
@zhlooking
一开始禁用 tableview 的滚动,最底部的 scrollview 的 contentSize = self.view+header.height (高),判断 scrollViewDidScroll 的 contentoffset ,当滚动超过 headerview.height 的时候,让 tableView.scrollEnabled = YES,scrollView.scrollEnabled=NO 。可以有这种效果,但是不太流畅,在 scrollViewDidScroll 还有一些其他代码吧。 不过特意写成这样,确定不是设计师故意折腾么?…………感觉能想到这效果然后让码农设计出来,也是够蛋疼的…… |
19
zhlooking OP @XDDD 主要是 tableView 的 headerView 还有一个下拉刷新的控件,盖住的话,要通过 contentOffset 来改变轮播的位置,很蛋疼。
@xxppxiaowei iOS 里面也有 offset 的。 @a412739861 还要有下拉刷新和上拉刷新的控件,碎了一地……现在的方法是只使用一个 tableView ,设置 contentInset 的 top ,把轮播放在 tableView 里,在下拉刷新的时候通过 contentOffset 控制轮播的 originY 来显示下拉控件。不过和知乎的实现方式有差别。 |
20
chenghuang 2016-05-19 20:36:12 +08:00
完美实验。。。
首先加一个 headerview 在 tableview 上,高度 0.然后假设上面的广告栏为 100 ,增加下面代码 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGRect rect = scrollView.frame; if (rect.origin.y > 0) { self.header.frame =CGRectMake(0, 0, self.view.bounds.size.width, scrollView.contentOffset.y); self.collectionView.tableHeaderView = self.header; scrollView.frame = CGRectMake(0, 100 - scrollView.contentOffset.y, self.view.bounds.size.width, self.view.bounds.size.height); }else{ if (scrollView.contentOffset.y <= 100) { self.header.frame =CGRectMake(0, 0, self.view.bounds.size.width, scrollView.contentOffset.y); self.collectionView.tableHeaderView = self.header; scrollView.frame = CGRectMake(0, 100 - scrollView.contentOffset.y, self.view.bounds.size.width, self.view.bounds.size.height); } } } |
21
codeisjobs 2016-05-19 20:44:28 +08:00 via iPhone
我估计还是 scrollview 嵌套一个轮播和 tableview ,如何判断手势的话,根据需求监听响应者进行判断就行了
|
22
zhlooking OP @chenghuang headerView 已经被下拉刷新的控件占了。现在用的做法是设置 contentInset ,再加一个 View 进去。
|
23
XDDD 2016-05-19 20:54:07 +08:00
@zhlooking 移动轮播很麻烦吗?
``` override func viewDidLoad() { super.viewDidLoad() tableView.contentInset = UIEdgeInsets(top: topView.frame.height, left: 0, bottom: 0, right: 0) tableView.scrollIndicatorInsets = UIEdgeInsets(top: topView.frame.height, left: 0, bottom: 0, right: 0) } func scrollViewDidScroll(scrollView: UIScrollView) { var rect = topView.frame let offset = -scrollView.contentOffset.y let topBarheight = self.navigationController?.navigationBar.frame.height ?? 0 if offset < (topBarheight + rect.height) { rect.origin.y = offset - topView.frame.height } else { rect.origin.y = topBarheight } topView.frame = rect } ``` 知乎的实现方法好像不是这样(观察 Indicator 的位置),不过效果差别不大 |
25
cbf188 2016-05-20 00:08:11 +08:00 via iPhone
上知乎问问看(^_^)
|