最近,浏览简书的时候,发现简书iOS客户端的个人主页,有这种滑动悬停的效果,自己也想动手实现下。下面是我的实现效果:
整个代码实现过程不复杂,复杂的是实现思路。如何实现推上去的效果,和实现tab分页控件的悬停效果是重点。
方案一 :利用tableView的sectionHeader悬停效果
以下是实现思路:
一.分页Tab控件的滑动悬停效果:
这部分当时想自定义个控件来实现,一直没有找到合适的方法。后来网上看到,有人说在顶部放个大小一样的Tab分页控件先隐藏,当tabview滑动到顶部时,滑动的隐藏,原来隐藏的再出现,这样也会有问题。后来我决定这部分能悬停的设置为tabview的sectionHeader,tableview设置为plain就可以实现悬停。
二.顶部导航栏被顶上去的效果:
以前做过的项目,用系统的导航栏,被坑过很多次。这次索性不用系统的导航栏,直接用和导航栏一样高度的view充当假的导航栏。然后在tableview的UIScrollviewDelegate代理方法里,根据便宜量,改变导航栏view的transform。这个地方刚开始是改变transform的height,后来发现有问题,就改为改变transform的y。
三.底部可以横向滑动的Tab和三个tableView:
分页Tab是作为tableview的sectionHeader,然后它本身底层是个scrollview,上面放了三个Button。下面其实是一个很大的cell,cell里放了一个scrollview,sacrollview里又放了三个tableview。sectionHeader里的scrollview和cell里的scrollview实现滑动联动。
方案二 :将需要悬停部分当做cell的子视图contentView,然后顶部悬浮地方,添加一个floatview。在floatview和cell之间切换子视图。
在scrollViewDidScroll代理方法中,实现切换:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
float ofsetY = scrollView.contentOffset.y;
float limitY = self.headerView.frame.size.height + 40*5;
if (ofsetY >= limitY) {
[self.floatView addSubview:self.suspendCell.contentView];
self.floatView.hidden = NO;
} else {
self.floatView.hidden = YES;
[self.suspendCell addSubview:self.suspendCell.contentView];
}
}
如有不对或者有待完善的地方,或者更好的实现思路,欢迎大家留言指正。