GithubHelp home page GithubHelp logo

spstore / sppagemenu Goto Github PK

View Code? Open in Web Editor NEW
434.0 11.0 93.0 4.24 MB

分页菜单,功能非常齐全,满足绝大多数APP,简书地址:

Home Page: http://www.jianshu.com/p/d746b550b541

Objective-C 97.87% Ruby 2.13%
segment menu page pagemenu bar uisegment sppagemenu scrollview component

sppagemenu's Introduction

SPPageMenu

Build Status Pod Version Pod Platform Language Pod License Carthage compatible codecov

目录

如何安装

版本3.5.0

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.5.0'
end

说明:3.5.0版本在3.4.5版本的基础上改动如下:
1、新增7个API
* - (void)setContent:(id)content forItemAtIndex:(NSUInteger)itemIndex;
* - (void)setCustomSpacing:(CGFloat)spacing afterItemAtIndex:(NSUInteger)itemIndex;
* - (CGFloat)customSpacingAfterItemAtIndex:(NSUInteger)itemIndex;
* - (CGRect)titleRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; 
* - (CGRect)imageRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; 
* - (CGRect)buttonRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; 
* - (void)addComponentViewInScrollView:(UIView *)componentView; 
2、在不可滑动自适应内容的排列方式下,设置间距依然生效
3、修复设置指定item宽度和内间距失效问题
4、修复多次对bridgeScrollView赋值上一个KVO观察者未移除问题

版本3.4.5

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.4.5'
end

说明:3.4.5版本在3.4.4版本的基础上修复了先设置unSelectedItemTitleFont,再设置items文字显示不全问题

版本3.4.4

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.4.4'
end

说明:3.4.4版本在3.4.2版本的基础上改动如下:
1、重构了内部自定义按钮
2、解决了标题颜色的alpha值小于1时颜色渐变不准确问题
3、新增SPPageMenuButtonItem模型,用于同时设置文字和图片

版本3.4.2

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.4.2'
end

说明:3.4.2版本在3.4.1版本的基础上,trackStyle属性支持storyBoard/xib,方便在storyBoard/xib中创建时可以直接设置

版本3.4.1

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.4.1'
end

3.4.1版本在3.4.0版本的基础上修复了多次调用setItems:selectedItemIndex:方法引发的问题

版本3.4.0

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.4.0'
end

说明:3.4.0版本在3.0版本的基础上主要改动如下:
1、增加trackerFollowingMode属性,跟踪器跟踪模式
2、增加selectedItemTitleFont和unSelectedItemTitleFont属性,设置选中item的标题字体和非选中item的标题字体
3、增加设置和获取背景图片的方法
4、修复跟踪器缩放文字显示不全问题
5、优化代码

版本3.0

target 'MyApp' do
  pod 'SPPageMenu', '~> 3.0'
end

说明:3.0版本在2.5.5版本的基础上主要改动如下:
1、新增numberOfItems属性,意思是items的个数
2、新增bounces属性,滑动scrollView时的边界反弹效果
3、新增alwaysBounceHorizontal属性,水平方向上,当内容没有充满scrollView时,滑动scrollView是否有反弹效果
4、新增设置或获取指定按钮的四周内边距的方法
5、分割线适配屏幕分辨率,并修改了默认颜色
6、内部scrollView的scrollsToTop属性置为NO,不妨碍外界scrollView的置顶功能
7、右侧功能按钮的单边阴影效果采用shadowPath
8、细化内部的自定义按钮,比如可以设置文字与图片之间的间距
9、修复设置指定item的文字较长时的显示不全的问题
10、修复插入和删除操作引发的bug
11、修复长按按钮然后滑动scrollView无法滑动问题

版本2.5.5

target 'MyApp' do
  pod 'SPPageMenu', '~> 2.5.5'
end

说明:2.5.5版本在2.5.3版本的基础上主要改动如下:
1、增加可以设置跟踪器宽度的属性,增加可以设置跟踪器高度和圆角半径的方法
2、修复了当未选中按钮颜色的alpha值小于1时,颜色渐变不准确问题
3、废弃了文字缩放(SPPageMenuTrackerStyleTextZoom)的枚举,该枚举由属性selectedItemZoomScale
   代替,增加了SPPageMenuTrackerStyleNothing枚举
4、可以设置分割线高度
版本2.5.3
target 'MyApp' do
  pod 'SPPageMenu', '~> 2.5.3'
end

部分功能演示图

(友情提示:如果您的网络较慢,gif图可能会延迟加载,您可以先把宝贵的时间浏览其它信息)

image

重难点讲解

// 该属性是选中的按钮下标,大家可以通过这个属性判断选择了第几个按钮,如果改变其值,可以用于切换选中的按钮

@property (nonatomic) NSInteger selectedItemIndex; 
// 这个scrollView是外界传进来的scrollView,通常的案例都是在pageMenu的下方有若干个子控制器在切换,子控制器的切换由滑动
scrollView实现,使用者只需要把该scrollView传给bridgeScrollView,SPPageMenu框架内部会监听该scrollView的横向滚动,实
现了让跟踪器时刻跟随该scrollView滚动的效果。暂时不支持监听垂直方向的滚动,如果你的scrollVeiw要垂直滚动实现切换按钮,你
不妨可以尝试自己在-scrollViewDidScroll:代理方法中设置selectedItemIndex的值

@property (nonatomic, strong) UIScrollView *bridgeScrollView;
// 排列方式:支持3种排列方式;1、可滑动,按钮宽度根据内容自适应;2、不可滑动,按钮等宽;3、不可滑动,按钮宽度根据内容自
适应。3种排列方式都有非常高的使用频率。第1种排列方式:SPPageMene的容量会根据按钮个数而定;第2种和第3种排列方式:SPPageMenu
的容量固定为SPPageMenu的宽度

@property (nonatomic, assign) SPPageMenuPermutationWay permutationWay; 
// 跟踪器跟踪模式;这个属性从3.4版本开始闪亮登场。该属性是个枚举,共3个:1、SPPageMenuTrackerFollowingModeAlways,这个
枚举值的意思是让跟踪器时刻跟随外界scrollView(即bridgeScrollView)横向移动; 2、SPPageMenuTrackerFollowingModeEnd,这个
枚举的意思是当外界scrollView滑动结束时,跟踪器才开始移动;相当于3.4版本之前的closeTrackerFollowingMode属性 3、
SPPageMenuTrackerFollowingModeHalf,这个枚举的意思是当外界scrollView拖动距离超过屏幕一半时,跟踪器开始移动。

@property (nonatomic, assign) SPPageMenuTrackerFollowingMode trackerFollowingMode;
// 内容的四周内边距(内容不包括分割线),默认UIEdgeInsetsZero;这个属性是个惊喜,往往能做到一些你意想不到的事情。假如你的
SPPageMenu控件高度固定不变,想要设置跟踪器与按钮之间的垂直间距变小,就可以设置该属性的top和bottom值,让SPPageMenu的
内容在垂直方向上内缩

@property (nonatomic, assign) UIEdgeInsets contentInset; 
// 该方法的效果和属性bridgeScrollView功能一致,如果外界想通过该方法实现跟踪器时刻跟随scrollView移动,可以在代理方法
-scrollViewDidScroll:中调用该方法,如果方法和属性同时实现,属性优先级更高

- (void)moveTrackerFollowScrollView:(UIScrollView *)scrollView;
// 代理方法:若以下2个代理方法同时实现了,只会走第2个代理方法(第2个代理方法包含了第1个代理方法的功能)
// 代理方法何时触发?代理方法有2种方式会触发,第一种是点击了SPPageMenu的按钮,这种方式无论点击的按钮是否同一个都会触发;
第二种是由滑动外界scrollView而触发,当跟踪模式为SPPageMenuTrackerFollowingModeAlways和SPPageMenuTrackerFollowingModeEnd
时,滑动scrollView结束的时候触发地代理方法,当跟踪器的跟踪模式为SPPageMenuTrackerFollowingModeHalf时,滑动scrollView
超过一半时就会触发代理方法

- (void)pageMenu:(SPPageMenu *)pageMenu itemSelectedAtIndex:(NSInteger)index;
- (void)pageMenu:(SPPageMenu *)pageMenu itemSelectedFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;

想了解更多使用细节,大家可以把demo下载到本地,里面有非常多的示例以及详细的注释

使用者提问

  • :当我设置排列方式为按钮等宽(即SPPageMenuPermutationWayNotScrollEqualWidths),为什么按钮文字显示不全?
    :这是因为你的按钮个数较多或者文字较长,你可以通过设置itemPadding属性来调整按钮之间的间距,间距调小,每个按钮的宽度就会增大, 如果itemPadding设置为0仍然显示不全,那就请选择其它排列方式。

  • :如何不通过点击按钮或者滑动外界scrollView来实现选中按钮的切换 ?
    :你可以改变selectedItemIndex的值切换选中按钮

  • :如何在不改变pageMenu高度的情况下,让跟踪器和按钮之间的垂直间距变小 ?
    :你可以通过设置contentInset的top和bottom值,让pageMenu的内容在垂直方向上往中间挤压

  • :如何给按钮设置角标 ?
    :本框架并未单独提供设置角标的方法,因为设置角标是一个比较大的工程,如果提供角标,又得给角标提供各种属性设置,这将会把本框架搞的非常臃肿,这也 不是本框架的重点内容,但是也不是不可以设置,你可以通过KVC获取按钮的数组buttons,然后通过该数组获取指定按钮,拿到该按钮就可以设置角标,具体 事例demo中有示范

回到顶部

sppagemenu's People

Contributors

spstore avatar

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

sppagemenu's Issues

CocoaPods 无法pod 到项目?

CocoaPods无法搜索都项目,是我个人网络问题还是?
pod search SPPage
[!] Unable to find a pod with name, author, summary, or description matching SPPage

假死

你有发现这个有时候会导致页面假死吗,整个页面卡住动不了

scrollsToTop

你有发现添加的tableview,点击状态栏都回不了顶部吗

Logo Design Offering as Open Source Contribution

Hello Sir. I'm a Graphics Designer. I'm happy to see an open source project, So, I want provide a logo for you. Would you mind if I propose a new logo design for your project as my Open Source Contribution?

Thanks for the attention.

手动设置collectionview的contentOffset值失效,能帮忙看看吗?

标签下面对应的Vc的collectionview去手动设置contentOffset失效,需求:浏览的页面再次打开会停留在上次的位置

//取出上一次保存的collectionView的y值
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
CGFloat offsety = [user floatForKey:@"offSet"];
NSLog(@"offsety=%f",offsety);
CGPoint targetPoint = CGPointMake(0, 300);
[self.DongwangMyCollectionView layoutIfNeeded];
self.DongwangMyCollectionView.contentOffset = targetPoint;

问题

能一次性加载吗,还有一定要外部创建scrollview传进去吗,滑动快的的时候,下标没有反应过来

界面传值呢

比如从A界面跳到有你这个page的界面怎么接受传值呢。

当第二次为 bridgeScrollView 赋值时,前一个没有移除对 contentOffset监听,可能导致崩溃

目前遇到的问题当第二次赋值后, 之前的 bridgeScrollView 如果已经被释放, 而且释放前没有从外部手工移除监听, 就会崩溃

建议在 setBridgeScrollView 这个方法内, 当第二次赋值时, 先移除前一个的监听, 而不仅仅是在 observeValueForKeyPath 方法中判断是否是当前监听的 scrollView

- (void)setBridgeScrollView:(UIScrollView *)bridgeScrollView {
    _bridgeScrollView = bridgeScrollView;
    if (bridgeScrollView) {
        
        [bridgeScrollView addObserver:self forKeyPath:scrollViewContentOffset options:NSKeyValueObservingOptionNew context:nil];
    } else {
        NSLog(@"你传了一个空的scrollView");
    }
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == self.bridgeScrollView) {
        if ([keyPath isEqualToString:scrollViewContentOffset]) {
            // 当scrolllView滚动时,让跟踪器跟随scrollView滑动
            [self prepareMoveTrackerFollowScrollView:self.bridgeScrollView];
        }
    } else {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}

是否可以加2个功能

1.item选中的背景色
2.图片和文本同时存在的布局更加自定义。例如是否可以直接像baritem一样传一个customView?

希望可以多扩展几个代理方法

1.点击到按钮的方法
2.滚动到按钮的方法
3.滚动到和点击到都会执行的方法

我现在有个需求就是点击最后一个按钮会弹出一个框,但是滚动到这个按钮的时不用弹出来,只有点击才弹出

仿微博页面滑动问题

demo里边仿微博,如果点击整个headerView或者分页条往上开始滑动,头部会把分页条遮盖住;
iPhoneX模拟器上点击子控制器滑动,如果滑动速度较快,也会将分页条遮盖住

滑块

可以监听到滑块,如果toIndex没有达到判断不让进入,回到fromIndex怎么做

大佬我发现一个细节bug

使用iOS 10 的时候那个 如果pageMenu 作为那个导航栏的item 时 一旦从当前页面push 时返回来时就会出现那个 pageMenu 从上下然后移动到正确的位置,移动很明显是为什么???

提个小问题

设置了这个属性SPPageMenuPermutationWayScrollAdaptContent在多数据中是可以滑动,但是在数据只有2个的情况下布局就不好看了,希望可以根据数据的多少来实现SPPageMenuPermutationWayNotScrollEqualWidths这个属性的布局,而且还可以滑动。

大神请问个问题

menu作为navigationItem 时为什么上面的每个按钮字为什么显示不全啊 非得点击了那个按钮才是正常的希望改正谢谢

关于增加scrollView怎么控制手势?

子控制器加的是tableView,tableview的头视图的是个广告轮播图,结果广告轮播图一滑动就SPPageMenu的滑动时间就触发了,请问怎么控制?

列表滑动删除手势冲突

当列表有滑动删除功能时,滑动的时候有时候响应分页,有时候响应滑动删除,能禁用滑动分页只响应点击分页吗?或者有其他的解决办法吗?

希望可以实现

第一个元素可以固定不滑动,跟功能按钮一样可以实现吗

仿微博按钮在iOS13上会失效

当滑动列表,把“第一页、第二页”等置顶的时候,再点击其他按钮,是失效,第二次点击的时候可以跳转界面

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.