PageMenu——灵活可定制的分页菜单控制器

⚠️ 该库已不再维护!

🎉 🎉 🎉 Surprise ! I'm back! 本期给大家带来的第三方框架是一个分页菜单控制器——PageMenu。该框架同时支持 Swift 和 Objective-C,使用起来也是极其方便,下面一起来跟我看看吧!

描述

一个完全可定制、非常灵活的分页菜单控制器,由位于滚动视图内的其他视图控制器构建,允许用户在任何类型的视图控制器之间切换,触发方式类似于Spotify,Windows Phone 和 Instagram 的中的轻击或滑动手势效果。

Similar to Spotify

PageMenuScreen2

Similar to Windows Phone

PageMenuScreen2

Similar to Instagram segmented control

PageMenuDemoScreen6

安装

CocoaPods

PageMenu 支持通过 CocoaPods 安装,⚠️ 此方式仅支持 Swift 语言。

将以下代码添加到你的 Podfile 文件中即可安装:

pod 'PageMenu'

Carthage

PageMenu 也支持通过 Carthage 安装。 添加以下代码到 Cartfile 并且按照 该指示 执行.

github "uacaps/PageMenu"

手动安装

用于 PageMenu 所需的类文件位于此项目根目录的 Classes 目录下:

  • CAPSPageMenu.swift

如何使用 PageMenu

首先,你必须创建一个视图控制器,该控件要作为页面菜单的容器。 该视图控制器可以是一个有独立 xib 文件、并将其 xib 文件放在 Storyboard 中的视图控制器。 在此之后,您将通过下面列出的几个简单的步骤,以便让所有的功能正常运行。

1. 将安装部分中列出的文件添加到项目中

2. 在容器视图控制器中添加 CAPSPageMenu 属性

Swift

var pageMenu : CAPSPageMenu?

Objective-C

@property (nonatomic) CAPSPageMenu *pagemenu;

3. 在视图控制器的 viewDidLoad 方法中添加初始化代码

Swift

// Array to keep track of controllers in page menu
var controllerArray : [UIViewController] = []

// Create variables for all view controllers you want to put in the 
// page menu, initialize them, and add each to the controller array. 
// (Can be any UIViewController subclass)
// Make sure the title property of all view controllers is set
// Example:
var controller : UIViewController = UIViewController(nibName: "controllerNibName", bundle: nil)
controller.title = "SAMPLE TITLE"
controllerArray.append(controller)

// Customize page menu to your liking (optional) or use default settings by sending nil for 'options' in the init
// Example:
var parameters: [CAPSPageMenuOption] = [
    .MenuItemSeparatorWidth(4.3), 
    .UseMenuLikeSegmentedControl(true), 
    .MenuItemSeparatorPercentageHeight(0.1)
]

// Initialize page menu with controller array, frame, and optional parameters
pageMenu = CAPSPageMenu(viewControllers: controllerArray, frame: CGRectMake(0.0, 0.0, self.view.frame.width, self.view.frame.height), pageMenuOptions: parameters)

// Lastly add page menu as subview of base view controller view
// or use pageMenu controller in you view hierachy as desired
self.view.addSubview(pageMenu!.view)

Objective-C

// 1. 该数组用于存放 PageMenu 所有需要包含的视图控制器
NSMutableArray *controllerArray = [NSMutableArray array];

// 2. 创建并初始化你想要放进 PageMenu 中的所有视图控制器的实例对象,并将其添加到控制器数组中。
//(可以是任何 UIViewController 的子类对象)
// 请确保设置所有视图控制器的标题属性。
// 示例代码:
UIViewController *controller = [UIViewController alloc] initWithNibname:@"controllerNibnName" bundle:nil];
controller.title = @"SAMPLE TITLE";
[controllerArray addObject:controller];

// 3. PageMenu 偏好设置,将所有参数封装到一个 NSDictionary 字典中
// 根据你的喜好(可选)自定义页面菜单,或在初始化时通过发送 nil 给 'options' 选项使用默认设置
// 示例代码:
NSDictionary *parameters = @{CAPSPageMenuOptionMenuItemSeparatorWidth: @(4.3),
                             CAPSPageMenuOptionUseMenuLikeSegmentedControl: @(YES),
                             CAPSPageMenuOptionMenuItemSeparatorPercentageHeight: @(0.1)
                             };

// 4. 通过控制器数组、尺寸和可选参数初始化 PageMenu
_pageMenu = [[CAPSPageMenu alloc] initWithViewControllers:controllerArray frame:CGRectMake(0.0, 0.0, self.view.frame.size.width, self.view.frame.size.height) options:parameters];

// 5. 最后,将 PageMenu 作为容器视图控制器的子视图添加进来
// 或根据需要将 pageMenu 控制器添加到视图的层次结构中,
[self.view addSubview:_pageMenu.view];

4. 可选 - 协议方法

如果需要使用委托方法,首先将 PageMenu 的委托设置为父视图控制器(就是让容器视图控制器遵守并实现 PageMenu 的委托协议 )。

Swift

// Optional delegate 
pageMenu!.delegate = self

Objective-C

// 可选委托协议 
_pageMenu.delegate = self;

之后,你就可以在父视图控制器中实现以下委托方法:

Swift

func willMoveToPage(controller: UIViewController, index: Int){}

func didMoveToPage(controller: UIViewController, index: Int){}

Objective-C

// 可选委托协议 
- (void)willMoveToPage:(UIViewController *)controller index:(NSInteger)index {}

- (void)didMoveToPage:(UIViewController *)controller index:(NSInteger)index {}

5. 🎉 你现在应该已经会使用 PageMenu 了!!

自定义设置

你可以按照需求用各种方法来自定义 PageMenu。并且在不久的将来,更多的定制方法也会被实现以确保 PageMenu 适应你的 APP 设计。这些都将是 CAPSPageMenu 在你的容器视图控制器中可修改的属性。

以下是每个类别提供的属性:

1) 颜色

  • Page Menu 滚动视图后面的背景色可融合到视图控制器背景中(Scroller View 的背景色)
    viewBackgroundColor (UIColor)
    
  • 滚动菜单背景颜色。默认值:[UIColor blackColor]
    scrollMenuBackgroundColor (UIColor)
    
  • 选择指示器的颜色。默认值:[UIColor whiteColor]
    selectionIndicatorColor (UIColor)
    
  • 当前选中的菜单项的标签颜色。默认值:[UIColor whiteColor]
    selectedMenuItemLabelColor (UIColor)
    
  • 未选中的菜单项标签颜色。默认为 [UIColor lightGrayColor]
    unselectedMenuItemLabelColor (UIColor)
    
  • 菜单项分隔符颜色(用于分段控件样式)。默认为 [UIColor lightGrayColor] 🚫 测了半天也没看见分隔符在哪 😂
    menuItemSeparatorColor (UIColor)
    
  • 菜单底部分割线颜色(页面菜单与视图之间的水平分割线)。默认值:[UIColor whiteColor]
    bottomMenuHairlineColor (UIColor)
    

2. Dimensions(尺寸)

  • 滚动菜单高度,默认值:34.0
    menuHeight (CGFloat)
    
  • 滚动菜单边距(第一个菜单项之前的距离,以及最后一个菜单项之后的距离以及菜单项之间的距离)默认值:15.0
    menuMargin (CGFloat)
    
  • 滚动菜单项宽度,默认值:111.0
menuItemWidth (CGFloat)
  • 选择指示器高度,默认值:3.0
selectionIndicatorHeight (CGFloat)

3. Segmented Control(分段控制器)

  • PageMenu 作为分段控件使用。默认值:NO
    useMenuLikeSegmentedControl (Bool)
    
  • 菜单项分隔符宽度(以像素为单位)
    menuItemSeparatorWidth (CGFloat)
    
  • 菜单项分隔符高度,以菜单高度的百分比表示。默认值:0.5
    menuItemSeparatorPercentageHeight (CGFloat)
    
  • 菜单项分隔符设置圆角。默认值:NO
    menuItemSeparatorRoundEdges (Bool)
    

4. 其他设置

  • 菜单项标题文本字体:默认值:[UIFont systemFontOfSize:15.0]
    menuItemFont (UIFont)
    
  • 添加菜单底部分割线。默认值:YES
    addBottomMenuHairline (Bool)
    
  • 菜单项宽度基于标题文字宽度(标题有多宽,菜单项就有多宽)。默认值:NO
    menuItemWidthBasedOnTitleTextWidth (Bool)
    
  • 禁用/启用滚动视图控制器的水平反弹。默认值:YES
    enableHorizontalBounce (Bool)
    
  • 隐藏/取消隐藏顶部页面菜单栏。默认值:NO
    hideTopMenuBar (Bool)
    
  • 如果菜单中的菜单项不跨越整个宽度就居中(目前不支持菜单项宽度基于标题)。默认值:NO
    centerMenuItems (Bool)
    
  • 在菜单项目中滚动动画持续时间,以毫秒为单位,默认值:500(即0.5秒)
    scrollAnimationDurationOnMenuItemTap (Int)
    

使用 PageMenu 的 APP

Please let me know if your app in the AppStore uses this library so I can add your app to the list of apps featuring PageMenu.

Future Work

  • Screen rotation support
  • Objective-C version
  • Infinite scroll option / Wrap items
  • Carthage support
  • More customization options

Demo

示例一

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIViewController *viewController1 = [[UIViewController alloc] init];
    viewController1.title = @"蔬菜";
    viewController1.view.backgroundColor = [UIColor robinEggColor];
    
    UIViewController *viewController2 = [[UIViewController alloc] init];
    viewController2.title = @"水果";
    viewController2.view.backgroundColor = [UIColor easterPinkColor];
    
    NSArray *controllerArray = @[viewController1, viewController2];
    
    NSDictionary *parameters = @{
                                
             // 【1.0】颜色
             // 【1.1】Scroller View 的背景色
//             CAPSPageMenuOptionViewBackgroundColor:[UIColor whiteColor],
             // 【1.2】设置滚动菜单背景颜色
             CAPSPageMenuOptionScrollMenuBackgroundColor:[UIColor beigeColor],
             // 【1.3】选择指示器颜色(底部菜单线颜色)
             CAPSPageMenuOptionSelectionIndicatorColor:[UIColor turquoiseColor],
             // 【1.4】所选菜单项标签文本颜色
             CAPSPageMenuOptionSelectedMenuItemLabelColor:[UIColor turquoiseColor],
             // 【1.5】未选择的菜单项标签文本颜色
             CAPSPageMenuOptionUnselectedMenuItemLabelColor:[UIColor lightGrayColor],
             // 【1.6】菜单项分隔符颜色(用于分段控件样式)
             CAPSPageMenuOptionMenuItemSeparatorColor:[UIColor grapefruitColor],
             // 【1.7】底部菜单线颜色
//             CAPSPageMenuOptionBottomMenuHairlineColor:[UIColor coralColor],
             
             // 【2.0】尺寸
             // 【2.1】滚动菜单高度,默认值:34.0
//             CAPSPageMenuOptionMenuHeight: @(40.0),
             // 【2.2】滚动菜单边距,默认值:15.0
//             CAPSPageMenuOptionMenuMargin:@(10),
             // 【2.3】滚动菜单项宽度,默认值:111.0
//             CAPSPageMenuOptionMenuItemWidth:@(150),
             // 【2.4】选择指示器高度,默认值:3.0
//             CAPSPageMenuOptionSelectionIndicatorHeight:@(5),
             
             // 【3.0】Segmented Control
             // 【3.1】将 PageMenu 作为分段控件使用
             CAPSPageMenuOptionUseMenuLikeSegmentedControl:@(YES),
             // 【3.2】菜单项分隔符宽度(以像素为单位)
//             CAPSPageMenuOptionMenuItemSeparatorWidth:@(5.0),
             // 【3.3】菜单项分隔符高度,以菜单高度的百分比表示
//             CAPSPageMenuOptionMenuItemSeparatorPercentageHeight:@(0.5),
             // 【3.4】菜单项分隔符具有圆形边
//             CAPSPageMenuOptionMenuItemSeparatorRoundEdges:@(YES),
//
             
             // 【4.0】其他
             // 【4.1】菜单项标题文本字体
//             CAPSPageMenuOptionMenuItemFont:[UIFont systemFontOfSize:17.0f],
             // 【4.2】添加菜单底部分割线
             CAPSPageMenuOptionAddBottomMenuHairline:@(NO),
//             // 【4.3】菜单项宽度基于标题文字宽度
//             CAPSPageMenuOptionMenuItemWidthBasedOnTitleTextWidth:@(YES)
             // 【4.4】禁用/启用滚动视图控制器的水平反弹
             CAPSPageMenuOptionEnableHorizontalBounce:@(NO),
//             // 【4.5】隐藏/取消隐藏顶部菜单栏
//             CAPSPageMenuOptionHideTopMenuBar:@(YES)
             // 【4.6】菜单中的菜单项如果不跨越整个宽度就居中
//             CAPSPageMenuOptionCenterMenuItems:@(YES)
             
                                 };
    
    CGRect pageMenuRect = CGRectMake(0.0,
                                     0.0,
                                     self.view.frame.size.width,
                                     self.view.frame.size.height);
    _pageMenu = [[CAPSPageMenu alloc] initWithViewControllers:controllerArray
                                                        frame:pageMenuRect
                                                      options:parameters];
    
    [self.view addSubview:_pageMenu.view];
    
}

运行效果:

示例二

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.PageContainerView addSubview:self.pageMenu.view];
}

#pragma mark - Custom Accessors 

// 缴费明细列表
- (HQLInsurancePaymentListViewController *)leftListViewController {
    if (!_leftListViewController) {
        _leftListViewController = [[HQLInsurancePaymentListViewController alloc] initWithNibName:NSStringFromClass([HQLInsurancePaymentListViewController class]) bundle:nil];
        _leftListViewController.title = @"缴费明细";
        _leftListViewController.delegate = self;
    }
    return _leftListViewController;
}

// 支出明细列表
- (HQLInsurancePaymentListViewController *)rightListViewController {
    if (!_rightListViewController) {
        _rightListViewController = [[HQLInsurancePaymentListViewController alloc] initWithNibName:NSStringFromClass([HQLInsurancePaymentListViewController class]) bundle:nil];
        _rightListViewController.title = @"支出明细";
    }
    return _rightListViewController;
}

// 分页菜单控制器
- (CAPSPageMenu *)pageMenu {
    if (!_pageMenu) {
        NSArray *controllerArray = @[ self.leftListViewController,
                                      self.rightListViewController ];
        
        NSDictionary *parameters = @{
                                     
             // 【1.2】设置滚动菜单背景颜色
             CAPSPageMenuOptionScrollMenuBackgroundColor:[UIColor whiteColor],
             // 【1.3】选择指示器颜色(底部菜单线颜色)
             CAPSPageMenuOptionSelectionIndicatorColor:HQLThemeColor,
             // 【1.4】所选菜单项标签文本颜色
             CAPSPageMenuOptionSelectedMenuItemLabelColor:HQLThemeColor,
    
             // 【2.0】尺寸
             // 【2.1】滚动菜单高度,默认值:34.0
             CAPSPageMenuOptionMenuHeight: @(40.0),
             // 【2.2】滚动菜单边距,默认值:15.0
//             CAPSPageMenuOptionMenuMargin:@(10),
             // 【2.3】滚动菜单项宽度,默认值:111.0
//             CAPSPageMenuOptionMenuItemWidth:@(150),
             // 【2.4】选择指示器高度,默认值:3.0
//             CAPSPageMenuOptionSelectionIndicatorHeight:@(5),
             
             // 【3.0】Segmented Control
             // 【3.1】将 PageMenu 作为分段控件使用
             CAPSPageMenuOptionUseMenuLikeSegmentedControl:@(YES),

             
             // 【4.0】其他
             // 【4.1】菜单项标题文本字体
//             CAPSPageMenuOptionMenuItemFont:[UIFont systemFontOfSize:17.0f],
             // 【4.2】添加菜单底部分割线
             CAPSPageMenuOptionAddBottomMenuHairline:@(NO),
             //             // 【4.3】菜单项宽度基于标题文字宽度
//             CAPSPageMenuOptionMenuItemWidthBasedOnTitleTextWidth:@(YES)
             // 【4.4】禁用/启用滚动视图控制器的水平反弹
             CAPSPageMenuOptionEnableHorizontalBounce:@(NO),
                                     };
        
        CGRect pageMenuRect = self.PageContainerView.bounds;
        _pageMenu = [[CAPSPageMenu alloc] initWithViewControllers:controllerArray
                                                            frame:pageMenuRect
                                                          options:parameters];
    }
    return _pageMenu;
}

参照运行效果:

其他框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,196评论 4 61
  • 静脉曲张是目前老少的一大难题,随着静脉曲张的发病率逐渐年轻化,很多的上班族以及在校学生也都遭到了静脉曲张的毒手。那...
    侠名_b9ed阅读 1,592评论 0 0
  • 你的好运气一定离不开你的实力,就如果子还没成熟前离开大树,必然会是有型无实,空有其表最后只能看着它一点点腐烂。 我...
    风妍浅浅阅读 3,339评论 0 1
  • 有一天,畅销书《异类》的作者格拉德威尔告诉你:“人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断...
    TS小西阅读 1,176评论 1 0