Giter Site home page Giter Site logo

pujiaxin33 / jxcategoryview Goto Github PK

View Code? Open in Web Editor NEW
6.1K 91.0 1.2K 31.18 MB

A powerful and easy to use category view (segmentedcontrol, segmentview, pagingview, pagerview, pagecontrol) (腾讯新闻、今日头条、QQ音乐、网易云音乐、京东、爱奇艺、腾讯视频、淘宝、天猫、简书、微博等所有主流APP分类切换滚动视图)

License: MIT License

Objective-C 99.47% Ruby 0.20% Swift 0.32%
category pageview segmentedcontrol pagingview categoryview scrollview collectionview indicator objective-c ios

jxcategoryview's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jxcategoryview's Issues

JXCategoryIndicatorView frame 位置不正确

ladpdgq9qswalmtmtm0e2g_1242_180 jpg_620x10000q90g
Uploading lADPDgQ9qSWalMTMtM0E2g_1242_180.jpg_620x10000q90g.jpg…
2018-10-11 10 53 33

我在JXCategoryIndicatorView.m的- (void)refreshState{}函数最后面添加了
JXCategoryIndicatorCell *selectedCell = (JXCategoryIndicatorCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:self.selectedIndex inSection:0]];
//是否点击了相对于选中cell左边的cell
JXCategoryCellClickedPosition clickedPosition = JXCategoryCellClickedPosition_Left;
CGRect clickedCellFrame = [self getTargetCellFrame:self.selectedIndex];
for (UIView *component in self.indicators)
{
[component jx_selectedCell:selectedCell.frame clickedRelativePosition:clickedPosition];
if ([component isKindOfClass:[JXCategoryIndicatorBackgroundView class]]) {
CGRect maskFrame = component.frame;
maskFrame.origin.x = maskFrame.origin.x - clickedCellFrame.origin.x;
selectedCellModel.backgroundViewMaskFrame = maskFrame;
}
}

并且修改了- (BOOL)selectCellAtIndex:(NSInteger)index {}函数
[selectedCell reloadData:selectedCellModel];写在了循环刷新Frame的前面
如果在刷新前面遍历写Frame,当cell的宽度太长时,会出现偏差。所以我写在了后面。

修改原因:JXCategoryIndicatorView位置不正确
可能是第一个选项显示cell宽度太长,导致我选中第二个的时候回自动滚动第二个到可见位置,然而JXCategoryIndicatorView获取的是滚动之前的cell的位置,导致JXCategoryIndicatorView位置显示不正确。

我暂时解决了问题,如果您进行了修改,我会重新Pod进工程,谢谢。

已发现bug.

在有tabarViewController的情况下, 同时点击JXCategoryView的标题和tabar的其它item, 会导致scrollview滚动位置错误.

使用titleLabelZoomScale 属性时cellWidth计算不准确

  • (CGFloat)preferredCellWidthWithIndex:(NSInteger)index {
    if (self.cellWidth == JXCategoryViewAutomaticDimension) {
    return ceilf([self.titles[index] boundingRectWithSize:CGSizeMake(MAXFLOAT, self.bounds.size.height) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : self.titleFont} context:nil].size.width );
    }else {
    return self.cellWidth;
    }
    }

建议修改如下 方法 width * self.titleLabelZoomScale

  • (CGFloat)preferredCellWidthWithIndex:(NSInteger)index {
    if (self.cellWidth == JXCategoryViewAutomaticDimension) {
    return ceilf([self.titles[index] boundingRectWithSize:CGSizeMake(MAXFLOAT, self.bounds.size.height) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : self.titleFont} context:nil].size.width * self.titleLabelZoomScale);
    }else {
    return self.cellWidth;
    }
    }

警告

Unbalanced calls to begin/end appearance transitions for <LoadDataListBaseViewController: 0x7fca2042b8b0>

关于切换动画

因为公司设计师也是参照闲鱼出的设计图,然后我发现闲鱼点击bar切换的时候scrollview没有明显的滚动动画,体验会好一点点

关于视图全部加载问题

使用categoryview时,初始化了controller,当categoryview所在的父控制器加载完毕后,子控制器也被加载完毕,并且viewDidAppear也调用了。有没有方法,进入时只加载一个,滑动第二个再加载第二个?

会多次回调didSelectedItemAtIndex这个方法

如,我JXCategoryTitleView添加了三个标题,也就是三个按钮

第一个和第三个不会多次回调,但是第二个按钮,只要轻轻的拖拽一下(不是直接拖动到其他按钮),就会执行四次代理,

指示器渐变色

您好, 能不能添加一个指示器渐变色的功能,最近产品看上了书旗小说书城页面顶部导航栏的那种切换效果,我看了下您的源码,能力有限没实现效果

代理方法不执行

self.categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, WindowsSize.width, categoryViewHeight)];
self.categoryView.delegate = self;
self.categoryView.contentScrollView = self.scrollView;
//------指示器属性配置------//
//lineView
JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
//triangleView
JXCategoryIndicatorTriangleView *triangleView = [[JXCategoryIndicatorTriangleView alloc] init];
lineView.indicatorLineWidth = 20;
//ballView
JXCategoryIndicatorBallView *ballView = [[JXCategoryIndicatorBallView alloc] init];
//backgroundView
JXCategoryIndicatorBackgroundView *backgroundView = [[JXCategoryIndicatorBackgroundView alloc] init];

titleCategoryView.indicators = @[lineView, triangleView, ballView, backgroundView];

[self.view addSubview:self.categoryView];

直接用JXCategoryTitleView为啥代理方法- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index 不执行

是否可以考虑增加一个获取cellWidth和scrollView.contentOffset.x的delegate

目前我使用下面这种方式获取的cellWidth,感觉可以增加一个获取cellWidthcontentOffset的delegate。(我的应用场景是用CategoryView做表头,通过cellWidth绘制表格,然后和通过KVO获取的scrollView.contentOffset.x做表格和表头同步滚动的效果😓)。

JXCategoryBaseCellModel *model = self.categoryTitleView.dataSource[0];
CGFloat cellWidth = model.cellWidth;

和UIPageViewController一起结合使用遇到的问题

首先感谢提供了这么好的一个库哈,很方便!

然后我们集成的时候,是把这个和UIPageViewController一起结合使用的,最开始我们在UIPageViewController里面获取到UIScrollView,命名为theScrollView,然后想通过

self.categoryView.contentScrollView = self.theScrollView;

实现两者结合,发现滑动的时候很怪,经常滑动了一下,而标题栏那里就滑动了2个,而且不太好追踪问题所在。

后来我们就想分开实现,首先实现当滑动之后,标题栏移动到相应的栏目上面,这个没问题,通过 [self.categoryView selectCellAtIndex:index];这个方法解决了,如下代码:

  • (void)viewPager:(ViewPagerController *)viewPager didChangeTabToIndex:(NSUInteger)index {

    [self.categoryView selectCellAtIndex:index];

}

然后我们想移动的过程中,有跟随动画,然后我们研究了源代码,然后结合你们源代码里对UIScrollview那样

[self.theScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

#pragma mark - KVO

  • (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
    {

    if ([keyPath isEqualToString:@"contentOffset"] && (self.theScrollView.isTracking || self.theScrollView.isDecelerating)) {
    //用户滚动引起的contentOffset变化,才处理。
    CGPoint contentOffset = [change[NSKeyValueChangeNewKey] CGPointValue];

      [self.categoryView contentOffsetOfContentScrollViewDidChanged:contentOffset];
    

    }
    }

主要是调用这个方法 [self.categoryView contentOffsetOfContentScrollViewDidChanged:contentOffset];

然后就怎么都没有反应。所以想请教一下这种和UIPageViewController结合使用的时候,想实现有跟随动画的话,有什么好的解决方法吗?

滑动返回的一些建议

问题:如果控制器处于selectedIndex非0的情况,手势返回会失效,优先处理了您仓库的滑动事件,要想手势返回,需要一直滑动到selectedIndex =0才能生效。
需求:不论selectedIndex等于多少,手势返回建议都能生效。
建议:继承UIScrollView

  • (BOOL)gestureRecognizer:(UIGestureRecognizer )gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer)otherGestureRecognizer {
    if ([self panBack:gestureRecognizer]) {
    return YES;
    }
    return NO;
    }

是否考虑下生命周期的问题

我发现 创建页面的时候,是一次性全部创建,所有的控制器都先执行了ViewDidLoad,和ViewWillAppear的方法

如果一次性创建多个控制器,会不会对性能有所影响?

使用UICollectionView重型控件实现功能是否合适?

CPU 资源消耗原因和解决方案
对象创建

对象的创建会分配内存、调整属性、甚至还有读取文件等操作,比较消耗 CPU 资源。尽量用轻量的对象代替重量的对象,可以对性能有所优化。比如 CALayer 比 UIView 要轻量许多,那么不需要响应触摸事件的控件,用 CALayer 显示会更加合适。如果对象不涉及 UI 操作,则尽量放到后台线程去创建,但可惜的是包含有 CALayer 的控件,都只能在主线程创建和操作。通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大非常多,在性能敏感的界面里,Storyboard 并不是一个好的技术选择。

以上内容来自https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

嵌套使用情况下的BUG

嵌套使用情况下,由子SegmentView切换导致父SegmentView切换时,快速左右滑动,响应的为父SegmentView的切换,该处逻辑稍有问题。
PS:功能挺多,辛苦了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.