{"id":13696532,"url":"https://github.com/SPStore/SPPageMenu","last_synced_at":"2025-05-03T17:31:32.178Z","repository":{"id":56921939,"uuid":"67928240","full_name":"SPStore/SPPageMenu","owner":"SPStore","description":"分页菜单，功能非常齐全，满足绝大多数APP，简书地址:","archived":false,"fork":false,"pushed_at":"2020-05-14T16:11:29.000Z","size":4339,"stargazers_count":437,"open_issues_count":45,"forks_count":94,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-14T20:55:58.135Z","etag":null,"topics":["bar","component","menu","page","pagemenu","scrollview","segment","sppagemenu","uisegment"],"latest_commit_sha":null,"homepage":"http://www.jianshu.com/p/d746b550b541","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SPStore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-11T12:19:21.000Z","updated_at":"2025-02-28T06:13:30.000Z","dependencies_parsed_at":"2022-08-20T22:20:19.453Z","dependency_job_id":null,"html_url":"https://github.com/SPStore/SPPageMenu","commit_stats":null,"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPStore%2FSPPageMenu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPStore%2FSPPageMenu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPStore%2FSPPageMenu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPStore%2FSPPageMenu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SPStore","download_url":"https://codeload.github.com/SPStore/SPPageMenu/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252226745,"owners_count":21714864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bar","component","menu","page","pagemenu","scrollview","segment","sppagemenu","uisegment"],"created_at":"2024-08-02T18:00:42.110Z","updated_at":"2025-05-03T17:31:29.452Z","avatar_url":"https://github.com/SPStore.png","language":"Objective-C","readme":"# SPPageMenu\n[![Build Status](http://img.shields.io/travis/SPStore/SPPageMenu.svg?style=flat)](https://travis-ci.org/SPStore/SPPageMenu)\n[![Pod Version](http://img.shields.io/cocoapods/v/SPPageMenu.svg?style=flat)](http://cocoadocs.org/docsets/SPPageMenu/)\n[![Pod Platform](http://img.shields.io/cocoapods/p/SPPageMenu.svg?style=flat)](http://cocoadocs.org/docsets/SPPageMenu/)\n![Language](https://img.shields.io/badge/language-Object--C-ff69b4.svg)\n[![Pod License](http://img.shields.io/cocoapods/l/SPPageMenu.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/SPStore/SPPageMenu)\n![codecov](https://img.shields.io/badge/codecov-88%25-orange.svg)\n\n# 目录\n* [如何安装](#如何安装)\n* [部分功能演示图](#部分功能演示图)\n* [重难点讲解](#重难点讲解) \n* [使用者提问](#使用者提问)\n\n## 如何安装\n#### 版本3.5.0\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.5.0'\nend\n\n说明：3.5.0版本在3.4.5版本的基础上改动如下:\n1、新增7个API\n* - (void)setContent:(id)content forItemAtIndex:(NSUInteger)itemIndex;\n* - (void)setCustomSpacing:(CGFloat)spacing afterItemAtIndex:(NSUInteger)itemIndex;\n* - (CGFloat)customSpacingAfterItemAtIndex:(NSUInteger)itemIndex;\n* - (CGRect)titleRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; \n* - (CGRect)imageRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; \n* - (CGRect)buttonRectRelativeToPageMenuForItemAtIndex:(NSUInteger)itemIndex; \n* - (void)addComponentViewInScrollView:(UIView *)componentView; \n2、在不可滑动自适应内容的排列方式下，设置间距依然生效\n3、修复设置指定item宽度和内间距失效问题\n4、修复多次对bridgeScrollView赋值上一个KVO观察者未移除问题\n```\n#### 版本3.4.5\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.4.5'\nend\n\n说明：3.4.5版本在3.4.4版本的基础上修复了先设置unSelectedItemTitleFont，再设置items文字显示不全问题\n```\n\n#### 版本3.4.4\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.4.4'\nend\n\n说明：3.4.4版本在3.4.2版本的基础上改动如下:\n1、重构了内部自定义按钮\n2、解决了标题颜色的alpha值小于1时颜色渐变不准确问题\n3、新增SPPageMenuButtonItem模型，用于同时设置文字和图片\n```\n\n#### 版本3.4.2\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.4.2'\nend\n\n说明：3.4.2版本在3.4.1版本的基础上,trackStyle属性支持storyBoard/xib,方便在storyBoard/xib中创建时可以直接设置\n```\n\n#### 版本3.4.1\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.4.1'\nend\n\n3.4.1版本在3.4.0版本的基础上修复了多次调用setItems:selectedItemIndex:方法引发的问题\n```\n\n#### 版本3.4.0\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.4.0'\nend\n\n说明：3.4.0版本在3.0版本的基础上主要改动如下：\n1、增加trackerFollowingMode属性，跟踪器跟踪模式\n2、增加selectedItemTitleFont和unSelectedItemTitleFont属性，设置选中item的标题字体和非选中item的标题字体\n3、增加设置和获取背景图片的方法\n4、修复跟踪器缩放文字显示不全问题\n5、优化代码\n```\n\n#### 版本3.0\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 3.0'\nend\n\n说明：3.0版本在2.5.5版本的基础上主要改动如下：\n1、新增numberOfItems属性，意思是items的个数\n2、新增bounces属性，滑动scrollView时的边界反弹效果\n3、新增alwaysBounceHorizontal属性，水平方向上，当内容没有充满scrollView时，滑动scrollView是否有反弹效果\n4、新增设置或获取指定按钮的四周内边距的方法\n5、分割线适配屏幕分辨率，并修改了默认颜色\n6、内部scrollView的scrollsToTop属性置为NO,不妨碍外界scrollView的置顶功能\n7、右侧功能按钮的单边阴影效果采用shadowPath\n8、细化内部的自定义按钮，比如可以设置文字与图片之间的间距\n9、修复设置指定item的文字较长时的显示不全的问题\n10、修复插入和删除操作引发的bug\n11、修复长按按钮然后滑动scrollView无法滑动问题\n```\n\n#### 版本2.5.5\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 2.5.5'\nend\n\n说明：2.5.5版本在2.5.3版本的基础上主要改动如下：\n1、增加可以设置跟踪器宽度的属性，增加可以设置跟踪器高度和圆角半径的方法\n2、修复了当未选中按钮颜色的alpha值小于1时，颜色渐变不准确问题\n3、废弃了文字缩放(SPPageMenuTrackerStyleTextZoom)的枚举，该枚举由属性selectedItemZoomScale\n   代替，增加了SPPageMenuTrackerStyleNothing枚举\n4、可以设置分割线高度\n```\n\n##### 版本2.5.3\n```\ntarget 'MyApp' do\n  pod 'SPPageMenu', '~\u003e 2.5.3'\nend\n```\n## 部分功能演示图\n（友情提示：如果您的网络较慢，gif图可能会延迟加载，您可以先把宝贵的时间浏览其它信息）\n\n![image](https://github.com/SPStore/SPPageMenu/blob/master/3006981-889f087b55f3e57f.gif)\n## 重难点讲解\n```\n// 该属性是选中的按钮下标，大家可以通过这个属性判断选择了第几个按钮，如果改变其值，可以用于切换选中的按钮\n\n@property (nonatomic) NSInteger selectedItemIndex; \n```\n```\n// 这个scrollView是外界传进来的scrollView，通常的案例都是在pageMenu的下方有若干个子控制器在切换，子控制器的切换由滑动\nscrollView实现，使用者只需要把该scrollView传给bridgeScrollView，SPPageMenu框架内部会监听该scrollView的横向滚动，实\n现了让跟踪器时刻跟随该scrollView滚动的效果。暂时不支持监听垂直方向的滚动，如果你的scrollVeiw要垂直滚动实现切换按钮，你\n不妨可以尝试自己在-scrollViewDidScroll：代理方法中设置selectedItemIndex的值\n\n@property (nonatomic, strong) UIScrollView *bridgeScrollView;\n```\n```\n// 排列方式：支持3种排列方式；1、可滑动，按钮宽度根据内容自适应；2、不可滑动，按钮等宽；3、不可滑动，按钮宽度根据内容自\n适应。3种排列方式都有非常高的使用频率。第1种排列方式：SPPageMene的容量会根据按钮个数而定；第2种和第3种排列方式:SPPageMenu\n的容量固定为SPPageMenu的宽度\n\n@property (nonatomic, assign) SPPageMenuPermutationWay permutationWay; \n```\n```\n// 跟踪器跟踪模式；这个属性从3.4版本开始闪亮登场。该属性是个枚举，共3个：1、SPPageMenuTrackerFollowingModeAlways，这个\n枚举值的意思是让跟踪器时刻跟随外界scrollView(即bridgeScrollView)横向移动； 2、SPPageMenuTrackerFollowingModeEnd，这个\n枚举的意思是当外界scrollView滑动结束时，跟踪器才开始移动；相当于3.4版本之前的closeTrackerFollowingMode属性 3、\nSPPageMenuTrackerFollowingModeHalf，这个枚举的意思是当外界scrollView拖动距离超过屏幕一半时，跟踪器开始移动。\n\n@property (nonatomic, assign) SPPageMenuTrackerFollowingMode trackerFollowingMode;\n```\n```\n// 内容的四周内边距(内容不包括分割线)，默认UIEdgeInsetsZero;这个属性是个惊喜，往往能做到一些你意想不到的事情。假如你的\nSPPageMenu控件高度固定不变，想要设置跟踪器与按钮之间的垂直间距变小，就可以设置该属性的top和bottom值，让SPPageMenu的\n内容在垂直方向上内缩\n\n@property (nonatomic, assign) UIEdgeInsets contentInset; \n```\n```\n// 该方法的效果和属性bridgeScrollView功能一致，如果外界想通过该方法实现跟踪器时刻跟随scrollView移动，可以在代理方法\n-scrollViewDidScroll:中调用该方法，如果方法和属性同时实现，属性优先级更高\n\n- (void)moveTrackerFollowScrollView:(UIScrollView *)scrollView;\n```\n```\n// 代理方法：若以下2个代理方法同时实现了，只会走第2个代理方法（第2个代理方法包含了第1个代理方法的功能）\n// 代理方法何时触发？代理方法有2种方式会触发，第一种是点击了SPPageMenu的按钮，这种方式无论点击的按钮是否同一个都会触发；\n第二种是由滑动外界scrollView而触发，当跟踪模式为SPPageMenuTrackerFollowingModeAlways和SPPageMenuTrackerFollowingModeEnd\n时，滑动scrollView结束的时候触发地代理方法，当跟踪器的跟踪模式为SPPageMenuTrackerFollowingModeHalf时，滑动scrollView\n超过一半时就会触发代理方法\n\n- (void)pageMenu:(SPPageMenu *)pageMenu itemSelectedAtIndex:(NSInteger)index;\n- (void)pageMenu:(SPPageMenu *)pageMenu itemSelectedFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;\n```\n### 想了解更多使用细节，大家可以把demo下载到本地，里面有非常多的示例以及详细的注释\n\n# 使用者提问\n* **问**：当我设置排列方式为按钮等宽(即SPPageMenuPermutationWayNotScrollEqualWidths)，为什么按钮文字显示不全？\u003cbr\u003e\n  **答**：这是因为你的按钮个数较多或者文字较长，你可以通过设置itemPadding属性来调整按钮之间的间距，间距调小，每个按钮的宽度就会增大，\n          如果itemPadding设置为0仍然显示不全，那就请选择其它排列方式。\n          \n* **问**：如何不通过点击按钮或者滑动外界scrollView来实现选中按钮的切换 ?\u003cbr\u003e\n  **答**：你可以改变selectedItemIndex的值切换选中按钮\n  \n* **问**：如何在不改变pageMenu高度的情况下，让跟踪器和按钮之间的垂直间距变小 ？ \u003cbr\u003e\n  **答**：你可以通过设置contentInset的top和bottom值，让pageMenu的内容在垂直方向上往中间挤压\n  \n* **问**：如何给按钮设置角标 ？ \u003cbr\u003e\n  **答**：本框架并未单独提供设置角标的方法，因为设置角标是一个比较大的工程，如果提供角标，又得给角标提供各种属性设置，这将会把本框架搞的非常臃肿，这也\n         不是本框架的重点内容，但是也不是不可以设置，你可以通过KVC获取按钮的数组buttons，然后通过该数组获取指定按钮，拿到该按钮就可以设置角标，具体\n         事例demo中有示范\n\n[回到顶部](#目录)\n\n","funding_links":[],"categories":["UI Components"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSPStore%2FSPPageMenu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSPStore%2FSPPageMenu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSPStore%2FSPPageMenu/lists"}