iOS开发---UIScrollView嵌套UITableView的悬停效果实现方式

一直以来,苹果的悬停效果,没有太多的逻辑,所以直接使用UITableview的组头悬停即可

但是最近的悬停效果比较繁琐,如果继续采用这方式,加上刷新的逻辑之后,或者有二级悬停之后,就不再好使了!

所以只能自己写这种效果了

遇到的坑,一开始以为只要判断悬停的位置,然后对两个控件进行 滚动属性的切换即可,但是发现有问题,到了临界点,有一下卡顿,滚动停止,父视图或者子视图,并不能完美的跟上滚动!所以这种方案就夭折了!

新方案:依然采用监测临界点的方法,但是这次通过设置两个视图的contenoffset属性,其实两个都在滚动,只是有一个一直在同一位置,视觉上就是一个在滚,一个等待了,到了临界点,滚动状态切换为相反,这样就实现了!

同时还有一个关键点就是要设置一下滚动视图的属性!下边直接上代码!

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ZDYCollectionView : UICollectionView <UIGestureRecognizerDelegate>

@end

NS_ASSUME_NONNULL_END


#import "ZDYCollectionView.h"

@implementation ZDYCollectionView

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    //该方法返回YES时,意味着所有相同类型的手势都会得到处理。
    return YES;
}

@end

下面是临界点判断逻辑

#pragma mark UIScrollView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //悬停高度
    CGFloat hoverHeight = 45.f;
    
    if (scrollView == _scrollView) {//父视图
        CGFloat scrollViewY = _scrollView.contentOffset.y;
        if (scrollViewY >= hoverHeight) {//当subcell还没有滚动到
            _scrollView.contentOffset = CGPointMake(0, hoverHeight);
            if (self.canScroll) {
                self.canScroll = NO;
                self.sonCanScroll = YES;
                NSLog(@"父视图悬停---111");
            }
        }else{
            if (!self.canScroll) {//子cell没到顶
                if (_collectionView.contentOffset.y == 0) {
                    self.canScroll = YES;
                    self.sonCanScroll = NO;
                    NSLog(@"父视图动---2222");
                }else{
                    _scrollView.contentOffset = CGPointMake(0, hoverHeight);
                    NSLog(@"父视图悬停---2222");
                }
                
            }
        }
        
        if (_scrollView.contentOffset.y == hoverHeight && _collectionView.contentOffset.y == 0) {
            self.canScroll = YES;
        }
        
    }
    //    NSLog(@"%lf",scrollView.contentOffset.y);
    if (scrollView == _collectionView) {//子视图
        CGFloat scrollViewY = _collectionView.contentOffset.y;
        if (!self.sonCanScroll&&self.canScroll) {
            _collectionView.contentOffset = CGPointZero;
            NSLog(@"子视图悬停---111");
        }
        if (scrollViewY <= 0) {
            self.sonCanScroll = NO;
            _collectionView.contentOffset = CGPointZero;
            self.canScroll = YES;
            NSLog(@"子视图悬停---2222");
        }
        
        if (_scrollView.contentOffset.y == hoverHeight && _collectionView.contentOffset.y == 0) {
            self.canScroll = YES;
        }
        
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值