iOS下拉选择菜单简单封装

本文实例为大家分享了简单封装的iOS下拉选择菜单代码,供大家参考,具体内容如下

//
// OrderListDownMenu.h 

#import <UIKit/UIKit.h> 

@protocol OrderListDownMenuDelegate <NSObject> 

- (void)OrderListDownMenu:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; 

@end 

typedef void(^Dismiss)(void); 

@interface OrderListDownMenu : UIView<UITableViewDataSource, UITableViewDelegate> 

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign) id<OrderListDownMenuDelegate> delegate;
@property (nonatomic, strong) NSArray *arrData;
@property (nonatomic, strong) NSArray *arrImgName;
@property (nonatomic, copy) Dismiss dismiss; 

- (instancetype)initWithDataArr:(NSArray *)dataArr origin:(CGPoint)origin width:(CGFloat)width rowHeight:(CGFloat)rowHeight; 

- (void)dismissWithCompletion:(void (^)(OrderListDownMenu *object))completion; 

@end
#import "OrderListDownMenu.h" 

#define TopToView 63.0f
#define rightToView kScreenWidth - 15.0f
#define LeftToView kScreenWidth - 145.0 - 10.0f
#define CellLineEdgeInsets UIEdgeInsetsMake(0, -80, 0, 0)
#define kScreenWidth    [UIScreen mainScreen].bounds.size.width
#define kScreenHeight    [UIScreen mainScreen].bounds.size.height 

@interface OrderListDownMenu() 

@property (nonatomic, assign) CGPoint origin;
@property (nonatomic, assign) CGFloat rowHeight; 

@end 

@implementation OrderListDownMenu 

- (instancetype)initWithDataArr:(NSArray *)dataArr origin:(CGPoint)origin width:(CGFloat)width rowHeight:(CGFloat)rowHeight { 

  self = [super initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
  if (self) {
    if (rowHeight <= 0) {
      rowHeight = 50;
    } 

    // 设置背景颜色
    self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.2];
    self.origin = origin;
    self.rowHeight = rowHeight;
    self.arrData = [dataArr copy];
    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(origin.x + LeftToView, origin.y + TopToView, width, rowHeight * dataArr.count) style:UITableViewStylePlain];
    _tableView.dataSource = self;
    _tableView.delegate = self;
    [self addSubview:_tableView]; 

    _tableView.backgroundColor = [UIColor whiteColor];
    _tableView.layer.cornerRadius = 2;
    _tableView.bounces = NO;
    _tableView.layer.cornerRadius = 8;
    _tableView.separatorColor = [UIColor colorWithWhite:0.3 alpha:1]; 

    _tableView.separatorStyle = UITableViewCellSelectionStyleNone;
    [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"]; 

    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
      [self.tableView setSeparatorInset:CellLineEdgeInsets];
    } 

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
      [self.tableView setLayoutMargins:CellLineEdgeInsets];
    }
  }
  return self;
} 

- (void)layoutSubviews {
  [super layoutSubviews];
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return self.arrData.count;
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  return self.rowHeight;
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
  cell.textLabel.textColor = THEME_COLOR_GRAY_1;
  cell.textLabel.font = [UIFont systemFontOfSize:15];
  cell.textLabel.text = self.arrData[indexPath.row]; 

  if (self.arrImgName.count > indexPath.row) {
    cell.imageView.image = [UIImage imageNamed:self.arrImgName[indexPath.row]];
    cell.imageView.contentMode = UIViewContentModeScaleAspectFit;
  } 

  UILabel *label = [[UILabel alloc] init];
  label.frame = CGRectMake(0, 49, _tableView.frame.size.width, 0.5);
  label.backgroundColor = THEME_SEPARATOR_COLOR;
  [cell.contentView addSubview:label]; 

  return cell;
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

  if([self.delegate respondsToSelector:@selector(OrderListDownMenu:didSelectRowAtIndexPath:)]){
    [self.delegate OrderListDownMenu:tableView didSelectRowAtIndexPath:indexPath];
  } 

  [tableView deselectRowAtIndexPath:indexPath animated:YES];
  [self dismissWithCompletion:nil];
} 

- (void)dismissWithCompletion:(void (^)(OrderListDownMenu *object))completion { 

  __weak __typeof(self) weakSelf = self;
  [UIView animateWithDuration:0.2 animations:^{
    weakSelf.alpha = 0;
    weakSelf.tableView.frame = CGRectMake(weakSelf.origin.x + LeftToView + 145, weakSelf.origin.y + TopToView, 0, 0);
  } completion:^(BOOL finished) {
    [weakSelf removeFromSuperview];
    if (completion) {
      completion(weakSelf);
    }
    if (weakSelf.dismiss) {
      weakSelf.dismiss();
    }
  }];
} 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

  UITouch *touch = [touches anyObject];
  if (![touch.view isEqual:self.tableView]) {
    [self dismissWithCompletion:nil];
  }
} 

- (void)drawRect:(CGRect)rect { 

  //[colors[serie] setFill]; 

  //拿到当前视图准备好的画板 

  CGContextRef context = UIGraphicsGetCurrentContext(); 

  //利用path进行绘制三角形 

  CGContextBeginPath(context);//标记 

  CGContextMoveToPoint(context,
             rightToView - 13, 53);//设置起点 

  CGContextAddLineToPoint(context,
              rightToView - 21, TopToView); 

  CGContextAddLineToPoint(context,
              rightToView - 4, TopToView); 

  CGContextClosePath(context);//路径结束标志,不写默认封闭 

  [self.tableView.backgroundColor setFill]; //设置填充色 

  [self.tableView.backgroundColor setStroke]; //设置边框颜色 

  CGContextDrawPath(context,
           kCGPathFillStroke);//绘制路径path
} 

@end 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS实现Pad上菜单弹出界面

    前言: 此种方式实现只适用于pad开发,在iPhone上是无效的. 实现: 比如我在界面上有一个按钮,点击按钮,在按钮旁边弹出一个Pop框. 1.按钮点击事件 btn.addTarget(self, action: #selector(self.popShow), for: .touchUpInside) 2.事件处理 /// 弹框选择条件 /// /// - Parameter sender: <#sender description#> func popShow(sender:UIButt

  • 如何使用jQuery技术开发ios风格的页面导航菜单

    效果图: 目前市场上越来越流行IOS风格的操作系统和导航方式,在今天的jQuery教程中,我们介绍如何生成一个iphone风格的菜单导航. HTML代码 我们使用镶嵌的<li>来生成菜单内容,并且包含在<nav>标签中,如下: <nav> <h1>导航菜单</h1> <ul> <li> <h2>专题教程</h2> <ul> <li> <h3>HTML专题教程<

  • iOS中长按调出菜单组件UIMenuController的使用实例

    UIMenuController的使用 UIMenuController的展现需要基于一个View视图,其交互则需要基于其所在View视图的Responder.举例来说,如果一个UIMenuController展现在当前ViewController的View上,则此UIMenuController的交互逻辑交由当前的ViewController进行管理. 在界面展示出UIMenuController需要3个条件: 1.当前的Responder处于第一响应. 2.UIMenuController对

  • iOS10 widget实现3Dtouch 弹出菜单

    文章将依次从以下几个问题着手,进行详细说明: 1.如何为现有的工程添加widget: 2.如何绘制UI: 3.如何调起app: 4.如何与host app共享数据. 图2 添加today的target 图3 添加today之后的工程目录 这是添加Today Extension之后的工程目录. 到这里,为现有的工程添加Today Extension算是完成了,运行程序就可以看到类似图1的简单的效果了,很简单哈. 绘制UI 图4 删除默认创建的MainInterface并修改Info.plist 这

  • iOS从App跳转至系统设置菜单各功能项的编写方法讲解

    跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"]; if ([[UIApplication sharedApplication] canOpenURL:url]) {     [[UIApplication sharedApplicatio

  • iOS 三级下拉菜单功能实现

    前言 App 常用控件 -- 多级下拉菜单, 如团购类, 房屋类, 对数据进行筛选. 有一级, 二级, 三级, 再多就不会以这种样式,呈现给用户了. 作者就简单聊一下 多级下拉菜单 一 目标 默认显示一个 TableView, 点击数据后, 添加第二个TableView, 并实现大小变化 第二次打开下拉菜单. 保存上次选中数据 二 菜单控件DropMenuView .h文件 #import <UIKit/UIKit.h> @class DropMenuView; @protocol DropM

  • iOS实现简单的二级菜单效果

    首先来看看要实现的效果图 示例代码如下 Untitled.gif #import "ViewController.h" #import "CollectionViewCell.h" #import "CollectionSectionView.h" @interface ViewController ()<UICollectionViewDelegateFlowLayout,UICollectionViewDataSource> @p

  • IOS中safari下的select下拉菜单文字过长不换行的解决方法

    今天遇到下图这种问题,文字过长,显示不全.折腾了老半天,在网上搜了半天也找不到解决方案. 于是问了下同事,同事提到了<optgroup>,这个标签厉害. <optgroup> 标签定义选项组. optgroup 元素用于组合选项.当您使用一个长的选项列表时,对相关的选项进行组合会使处理更加容易. 以上所述是小编给大家介绍的IOS中safari下的select下拉菜单文字过长不换行的解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对

  • IOS代码笔记之下拉菜单效果

    本文实例为大家分享了ios下拉菜单的具体代码,供大家参考,具体内容如下 一.效果图 二.工程图 三.代码 RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController @end RootViewController.m #import "RootViewController.h" #import "NIDropDown.h" @i

  • iOS实现顶部标签式导航栏及下拉分类菜单

    本文实例为大家分享了iOS实现顶部标签式导航栏及下拉分类菜单的全部过程,供大家参考,具体内容如下 当内容及分类较多时,往往采用顶部标签式导航栏,例如网易新闻客户端的顶部分类导航,最近刚好有这样的应用场景,参考网络上一些demo,实现了这种导航效果,记录一些要点. 效果图(由于视频转GIF掉帧,滑动和下拉动画显得比较生硬,刚发现quickTime可以直接录制手机视频,推荐一下,很方便) 1.顶部标签式导航栏 (1)实现思路 其实就是在上下两个UIScrollView上做文章,实现联动选择切换的效果

随机推荐