【iOS干货:快速集成搜索界面下拉菜单框架】

前言

这次推出的控件,比较常用,搜索界面下拉菜单,如果喜欢我的文章,可以关注我微博:袁峥Seemygo

Demo效果:

效果图.gif

Demo演示:

1.创建下拉菜单

    YZPullDownMenu *menu = [[YZPullDownMenu alloc] init];
    menu.frame = CGRectMake(0, 20, YZScreenW, 44);
    [self.view addSubview:menu];

2.设置下拉菜单代理

menu.dataSource = self;

3.添加所有下拉菜单对应的子控制器

为什么要这样设计?,因为每个app对应的下拉菜单不确定,所以交给各个开发者决定,下拉菜单的界面。

- (void)setupAllChildViewController
{
    YZAllCourseViewController *allCourse = [[YZAllCourseViewController alloc] init];
    YZSortViewController *sort = [[YZSortViewController alloc] init];
    YZMoreMenuViewController *moreMenu = [[YZMoreMenuViewController alloc] init];
    // 控制器最好作为自己的子控制器
    [self addChildViewController:allCourse];
    [self addChildViewController:sort];
    [self addChildViewController:moreMenu];
}

4.实现YZPullDownMenu数据源方法

#pragma mark - YZPullDownMenuDataSource
// 返回下拉菜单多少列
- (NSInteger)numberOfColsInMenu:(YZPullDownMenu *)pullDownMenu
{
    return 3;
}

// 返回下拉菜单每列按钮
- (UIButton *)pullDownMenu:(YZPullDownMenu *)pullDownMenu buttonForColAtIndex:(NSInteger)index
{
    YZMenuButton *button = [YZMenuButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:_titles[index] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [button setTitleColor:[UIColor colorWithRed:25 /255.0 green:143/255.0 blue:238/255.0 alpha:1] forState:UIControlStateSelected];
    [button setImage:[UIImage imageNamed:@"标签-向下箭头"] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:@"标签-向上箭头"] forState:UIControlStateSelected];
    
    return button;
}

// 返回下拉菜单每列对应的控制器
- (UIViewController *)pullDownMenu:(YZPullDownMenu *)pullDownMenu viewControllerForColAtIndex:(NSInteger)index
{
    return self.childViewControllers[index];
}

// 返回下拉菜单每列对应的高度
- (CGFloat)pullDownMenu:(YZPullDownMenu *)pullDownMenu heightForColAtIndex:(NSInteger)index
{
    // 第1列 高度
    if (index == 0) {
        return 400;
    }
    
    // 第2列 高度
    if (index == 1) {
        return 180;
    }
    
    // 第3列 高度
    return 240;
}

5.【更新菜单标题,需要发送通知给我】

为什么要这样设计?解耦,自己的控制器中就不需要导入我的框架的头文件了,侵入性不大。

【更新菜单标题步骤】

  • 1.把 【extern NSString * const YZUpdateMenuTitleNote;】这行代码拷贝到自己控制器中,这个在YZPullDownMenu.h

  • 2.在选中标题的方法中,发送以下通知
    [[NSNotificationCenter defaultCenter] postNotificationName:YZUpdateMenuTitleNote object:self userInfo:@{@"title":cell.textLabel.text}];

  • 3.1 postNotificationName:通知名称 =>【YZUpdateMenuTitleNote】

  • 3.2 object:谁发送的通知 =>【self】(当前控制器)

  • 3.3 userInfo:选中标题信息 => 可以多个key,多个value,没有固定的,因为有些界面,需要勾选很多选项,key可以随意定义。

  • 3.4 底层会自动判定,当前userInfo有多少个value,如果有一个就会直接更新菜单标题,有多个就会更新,满足大部分需求。

  • 3.5 发出通知,会自动弹回下拉菜单

5.1 可以参考YZSortViewController中代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    _selectedCol = indexPath.row;
    
    // 选中当前
    YZSortCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    // 更新菜单标题
    [[NSNotificationCenter defaultCenter] postNotificationName:YZUpdateMenuTitleNote object:self userInfo:@{@"title":cell.textLabel.text}];
}

源码

点击这下载源代码

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,241评论 4 61
  • 前言 这个控件比较常用,至少目前公司三个项目都用到了这个下拉菜单,是时候封装分享一下了。觉的不错的麻烦点个喜欢,三...
    so_what阅读 4,061评论 3 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,316评论 25 708
  • meterpreter是更高级的payload。 纯内存工作模式(不写硬盘),避免被电子取证;加密的通信协议,对传...
    Instu阅读 6,427评论 0 2
  • 拿到新办公室的钥匙有点蒙圈闭上眼睛有无数的需求跳了出来有无数需要缕顺的 借阿桃的图鼓励一下自己 晚安 全世界#
    哈哈同学阅读 163评论 0 0