由于项目需要实现一个上滑吸顶的效果,网上也看到有很多种方式实现,但是如果加上下拉刷新的功能会导致界面异常,还有第三方库实现方式库,太繁琐了,下面是我的实现方式,效果如下:
tablevie滑动吸顶
主要代码部分:
横线滚动代理方法updateTopViewFrame
//父视图滚动的回调,用于横向滚动判断
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"scrollViewDidScroll - %.2f, %.2f",scrollView.contentOffset.x, scrollView.contentOffset.y);
CGFloat placeholderOffset = 0;
UIScrollView *scroll;
if (self.topView.selectedIndex == 0) {
scroll = self.firstTableView;
}else {
scroll = self.secondTableView;
}
if (scroll.contentOffset.y > CGRectGetHeight(self.topView.frame) - self.topView.itemHeight) {
placeholderOffset = CGRectGetHeight(self.topView.frame) - self.topView.itemHeight;
}else {
placeholderOffset = scroll.contentOffset.y;
}
//当主talbeview向上滑动的时候,要禁止主scrollerview滑动,
if([scrollView isKindOfClass:CustomScrollView.class]){
if(scrollView.contentOffset.y >= 0){ //向上滑动
self.ctyscrollview.contentOffset = CGPointZero;
self.ctyscrollview.scrollEnabled = NO;
self.firstTableView.contentOffset = CGPointZero;
self.secondTableView.contentOffset = CGPointZero;
}
return;
}
[self.secondTableView setContentOffset:CGPointMake(0, placeholderOffset) animated:NO];
[self.firstTableView setContentOffset:CGPointMake(0, placeholderOffset) animated:NO];
}
纵向滑动代理方法updateTopViewFrame
//子视图滚动的回调,用于竖直方向上滚动判断
- (void)updateTopViewFrame:(UIScrollView *)scrollView{
CGFloat placeHolderHeight = CGRectGetHeight(self.topView.frame) - self.topView.itemHeight;
CGFloat offsetY = scrollView.contentOffset.y;
//顶部topiview跟随滑动
CGFloat y = 0.0;
if (offsetY >= 0 && (offsetY <= placeHolderHeight)) {
NSLog(@"1- offsetY:%.2f <= placeHolderHeight:%.2f", offsetY, placeHolderHeight);
y = -offsetY;
} else if (offsetY > placeHolderHeight) {
NSLog(@"2- offsetY:%.2f > placeHolderHeight:%.2f", offsetY, placeHolderHeight);
y = -placeHolderHeight;
} else if (offsetY < 0) {
NSLog(@"3- offsetY:%.2f < 0, placeHolderHeight:%.2f", offsetY, placeHolderHeight);
y = -offsetY;
}
self.topView.y = y;
//当主scrollerview滑动的时候,tableview要禁止滑动,
if(offsetY <= 0){
self.ctyscrollview.scrollEnabled = YES;
self.firstTableView.contentOffset = CGPointZero;
self.secondTableView.contentOffset = CGPointZero;
if(!CGPointEqualToPoint(self.ctyscrollview.frame.origin, CGPointZero)){
self.ctyscrollview.contentOffset = CGPointZero;
}
}else{
self.ctyscrollview.scrollEnabled = NO;
}
}
CustomScrollView中需要加上以下联动代理方法
///允许同时接受手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
demo代码下载地址: