iOS开发(JXPagerView、JXCategoryView)遇到的问题及解决办法


一、 当listView内部持有的UIScrollView或UITableView或UICollectionView,滑动UIScrollView或UITableView或UICollectionView会瞬间置顶

这个主要是分页的子控制器里面的代理协议方法listViewDidScrollCallback没有把JXPagerViewListView的scrollView和UIScrollView或UITableView或UICollectionView的scrollView关联起来导致的,一般分页的子控制器都要实现如下三个方法

@protocol JXPagerViewListViewDelegate <NSObject>

/**
 返回listView。如果是vc包裹的就是vc.view;如果是自定义view包裹的,就是自定义view自己。

 @return UIView
 */
- (UIView *)listView;

/**
 返回listView内部持有的UIScrollView或UITableView或UICollectionView
 主要用于mainTableView已经显示了header,listView的contentOffset需要重置时,内部需要访问到外部传入进来的listView内的scrollView

 @return listView内部持有的UIScrollView或UITableView或UICollectionView
 */
- (UIScrollView *)listScrollView;


/**
 当listView内部持有的UIScrollView或UITableView或UICollectionView的代理方法`scrollViewDidScroll`回调时,需要调用该代理方法传入的callback

 @param callback `scrollViewDidScroll`回调时调用的callback
 */
- (void)listViewDidScrollCallback:(void (^)(UIScrollView *scrollView))callback;

@protocol 协议方法必须实现,没写或没写全会直接崩溃的而想要解决上面的bug可以这样写

// 定义一个block回调
@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView);

// 滑动的代理事件,滑动的时候就会调用这个回调,把scrollView传进去
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    self.scrollCallback(scrollView);
}

// 再把listViewDidScrollCallback的scrollView关联起来
- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback {
    self.scrollCallback = callback;
}
修改后的效果图

二、 当listView内部持有的UIScrollView或UITableView弹簧效果与下拉刷新冲突

在初始化JXPagerView的时候禁用了UIScrollView或UITableView弹簧效果(bounces)即可

        _pagerView = [[JXPagerView alloc]initWithDelegate:self];
        _pagerView.mainTableView.bounces = NO;

2022年1月15 更新
如果上面的方法没用可以将JXPagerView换成JXPagerListRefreshView, 作者的Demo就是用的JXPagerListRefreshView

_pagerView = [[JXPagerListRefreshView alloc]initWithDelegate:self];

三、 顶部的View高度改变不适配问题

  • 一开始没改变之前的顶部View高度不对,可以在返回顶部View的代理方法里面这样写
// 我_headerView里面使用约束来布局的
- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView
{
    CGFloat headerH = [_headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return headerH;
}
  • 点击改变_headerView高度就重新改变一下它的frame,最重要刷新一下JXPagerView
CGFloat headerViewH = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
self.headerView.frame = CGRectMake(0.f, 0.f, [UIScreen mainScreen].bounds.size.width, headerViewH);
[self.pagerView reloadData];

四、 如果滑上去顶部是一个导航栏,导航栏下面才是JXCategoryTitleView

像这样:


有两种方法

  • 把这个JXPagerView的约束布局在导航栏之下,下图就是这样做的,导航栏放着个搜索框,然后JXPagerView放在它之下,无论怎么滑,都是顶着导航栏的


  • 而下图JXPagerView是紧贴最顶部的,导航栏隐藏了起来


JXPagerView滑动的时候有个代理方法可以监听它滑动,相当于scrollView的scrollViewDidScroll方法,就是 - (void)mainTableViewDidScroll:(UIScrollView *)scrollView,当然你要在分页子控制器里面写好那三个代理方法先
mainTableViewDidScroll里面判断如果self.pagerView.mainTableView.contentOffset.y是否大于导航栏高度,小于就设置self.pagerView.mainTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);,大于就设置self.pagerView.mainTableView.contentInset = UIEdgeInsetsMake(kNavBarHeight, 0, 0, 0); (kNavBarHeight为导航栏高度),这样看下效果


这时又会出现一个bug,就是当你手离开屏幕,如果屏幕还在滑,那JXCategoryView又滑上去。这时可以用JXPagerView的一个属性

/**
 顶部固定sectionHeader的垂直偏移量。数值越大越往下沉。
 */
@property (nonatomic, assign) NSInteger pinSectionHeaderVerticalOffset;


   //y 轴 偏移量
    CGFloat y = self.pagerView.mainTableView.contentOffset.y;
    //需要计算的高度,kNavBarHeight为导航栏高度
    CGFloat h = kNavBarHeight;

    CGFloat alpha = 0;
    //超出偏移量的返回
    if (y < 0) {
        return;
    }else if (y < h) {
        self.pagerView.mainTableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
        self.pagerView.pinSectionHeaderVerticalOffset = 0;  
    }
    else{
        self.pagerView.pinSectionHeaderVerticalOffset = kNavBarHeight;
    }

最好还是在小于导航栏高度的时候设置一下mainTableView的contentInset,要不然有时候会不顺畅和底部留空,效果如下(部分代码不展示)


五、 适配iOS15 JXPagerView顶部会留白

// 在定义JXPagerView的时候
if (@available(iOS 15.0, *)) {
  _pagerView.mainTableView.sectionHeaderTopPadding = 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359

推荐阅读更多精彩内容