效果图
使用方法
1、子类需要继承
HHLinkageViewController
2、设置常用属性,中间titles高度为宏定义LINKAGEVIEWH
@property (nonatomic, copy) NSArray <UIViewController *>*viewControllers;//子控制器
@property (nonatomic, strong, readonly) HHLinkageView *linkageView;//只读中间标题视图
@property (nonatomic, strong) UIView *headerView;//自定义头部试图,可以只设置高度
@property (nonatomic, copy) NSArray *titlesArray;//中间标题
@property (nonatomic, assign) BOOL isNeedLessMove;//数据少于屏幕是否需要滑动,默认YES
3子控制器
scrollViewDidScroll
中分别调用父控制器如下方法
/**
@param scrollView 子控制器tableView
@param index 子控制器所在的索引值
*/
- (void)childScrollViewDidScroll:(UIScrollView *)scrollView index:(NSInteger)index;
基本讲解
我们知道
frame
是相对于父控件的位置,bounds
是相对于自己的位置,可以用来改变子视图的位置,我的出发点就是通过改变tableView的bounds实现的,核心代码也就50行左右。
我们的目的是tableView上下滑动的时候,改变collectionView的y值,同时tableView的contentOffset不变。
1、 我们需要先判断滑动方向,调用如下方法
CGPoint velocity = [scrollView.panGestureRecognizer velocityInView:nil];
同时引入中间变量_direction
,因为当手指离开屏幕时velocity
会变为0,我们需要保留离开屏幕时的方向。
2、 我们先考虑向上滑动的情况,箭头为滑动方向
情景一不包含偏移量,如下图
我们只需要把collectionView
的y
减去滑动的offset
,同时把scrollView
的bounds
的y
设置为0,这样collectionView
就可以滑动了,而scrollView
却不变
_collectionView.y -= offsetY;
CGRect tempFrame = scrollView.bounds;
tempFrame.origin.y = 0;
scrollView.bounds = tempFrame;
情景二包含偏移量,如下图
我们需要引入一个变量offsetArray
,用来保存上一次滑动之后的偏移量,在赋值的时候减去详细的偏移量。需要注意的是改变scrollView.bounds
的y
的时候,不能直接赋值为上次的保留值conserverOffset
,需要向上偏移一点,这样在快速滑动松手的时候,才会有惯性。
CGFloat conserverOffset = _offsetArray[index].floatValue;
if (conserverOffset) {
_collectionView.y -= (offsetY-conserverOffset);
CGRect tempFrame = scrollView.bounds;
tempFrame.origin.y = conserverOffset+0.3;//0.3是为了保留惯性
scrollView.bounds = tempFrame;
}
3、 方向向下和向上的差不多,具体看下代码吧
最后统一处理边界值就可以了,是不是特别简单。
if (_collectionView.y>=_headerView.height+LINKAGEVIEWH) {
_collectionView.y = _headerView.height+LINKAGEVIEWH;
_linkageView.y = _headerView.height;
}else if (_collectionView.y<=LINKAGEVIEWH){
_collectionView.y = LINKAGEVIEWH;
_linkageView.y = 0;
}else{
_linkageView.y = _collectionView.y-LINKAGEVIEWH;
}
4、 cocoapod下载
target 'MyApp' do
pod 'HHLinkageViewController', '~> 1.0.0'
end
下载地址:Github
我的上一篇:炫酷转场动画-iOS