//MenuView.h

 

//

//  MenuView.h

//  RockPopMenu

//

//  Created by zhuang chaoxiao on 14-6-26.

//  Copyright (c) 2014年 zhuang chaoxiao. All rights reserved.

//

#import <UIKit/UIKit.h>

@protocol MenuViewDelegate

@optional

@end

@interface MenuView : UIView

{

NSArray * _itemArray;

UIView * _itemBackView;

}

@property(nonatomic,weak) id<MenuViewDelegate> delegate;

+(id)shareMenuView;

+(void)showPopView:(UIView *)parentView withRect:(CGRect)rect withMenuItem:(NSArray*)array;

@end

/////////////////////////////////////////////////////////////////////////////////////////////////

@interface MyMenuItem : NSObject

{

//NSString * _strTitle;

//UIImage * _iconImg;

}

-(void)performAction;

+(id)initMenuItemWithTitle:(NSString*)title withIcon:(UIImage*)img withTarget:(id)target withSelector:(SEL)selector;

@property(nonatomic,strong) NSString * strTitle;

@property(nonatomic,strong) UIImage * iconImg;

@property(nonatomic,weak) id target;

@property(nonatomic) SEL action;

@end

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//MenuView.m
 

//

//  MenuView.m

//  RockPopMenu

//

//  Created by zhuang chaoxiao on 14-6-26.

//  Copyright (c) 2014年 zhuang chaoxiao. All rights reserved.

//

#import "MenuView.h"

#define ITEM_MARGIN_X 5.0f

#define ITEM_MARGIN_Y 5.0f

#define ITEM_IMAGE_WIDTH 28.0f

#define ITEM_IMAGE_HEIGHT 28.0f

#define ITEM_TEXT_WIDHT 100.0f

#define ITEM_TEXT_HEIGHT 25.0f

#define ITEM_WIDTH 145.0f

#define ITEM_HEIGHT 40.0f

@implementation MyMenuItem

+(id)initMenuItemWithTitle:(NSString*)title withIcon:(UIImage*)img withTarget:(id)target withSelector:(SEL)selector

{

return [[MyMenuItem alloc]initWithTitle:title withIcon:img withTarget:target withSelector:selector];

}

-(void)performAction

{

if( _target && [_target respondsToSelector:_action] )

{

[_target performSelectorOnMainThread:_action withObject:self waitUntilDone:YES];

}

}

-(id)initWithTitle:(NSString*)title withIcon:(UIImage*)img withTarget:(id)target withSelector:(SEL)selector

{

self = [super init];

if(self)

{

_strTitle = title;

_iconImg = img;

_target = target;

_action = selector;

}

return self;

}

@end

////////////////////////////////////////////////////////////////////////////////////////////////////////

@implementation MenuView

- (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

// Initialization code

self.frame = [[UIScreen mainScreen] bounds];

}

return self;

}

-(CGRect)layoutMenuItem:(UIView * )parentView

{

CGRect rect;

CGFloat yPos = 0;

int btnTag = 0;

UIView * contentView = [[UIView alloc]initWithFrame:CGRectZero];

for( MyMenuItem * item in _itemArray )

{

UIButton * btnView = [[UIButton alloc]initWithFrame:CGRectZero];

btnView.frame = CGRectMake(0, yPos, ITEM_WIDTH, ITEM_HEIGHT);

[contentView addSubview:btnView];

if( item.iconImg )

{

UIImageView * imgView = [[UIImageView alloc]initWithImage:item.iconImg];

imgView.frame = CGRectMake(ITEM_MARGIN_X, ITEM_MARGIN_Y, ITEM_IMAGE_WIDTH, ITEM_IMAGE_HEIGHT);

[btnView addSubview:imgView];

}

UILabel * lab = [[UILabel alloc]initWithFrame:CGRectMake(ITEM_MARGIN_X*2+ITEM_IMAGE_WIDTH, ITEM_MARGIN_Y, ITEM_TEXT_WIDHT, ITEM_TEXT_HEIGHT)];

lab.text = item.strTitle;

lab.textColor = [UIColor greenColor];

[btnView addSubview:lab];

btnView.tag = btnTag;

[btnView addTarget:self action:@selector(performAction:) forControlEvents:UIControlEventTouchUpInside];

++ btnTag;

yPos += ITEM_HEIGHT;

}

rect = CGRectMake(0, 0, ITEM_WIDTH, yPos);

contentView.frame = rect;

[parentView addSubview:contentView];

return rect;

}

-(void)performAction:(id)sender

{

UIButton *btn = (UIButton*)sender;

MyMenuItem * item = _itemArray[btn.tag];

[item performAction];

[self dismissPopView];

}

-(void)dismissPopView

{

[UIView animateWithDuration:0.5f animations:^(void){

self.alpha = 0.0f;

}completion:^(BOOL finished){

self.alpha = 1.0f;

[self removeFromSuperview];

}];

}

-(void)showPopView:(UIView *)parentView withRect:(CGRect)rect withMenuItem:(NSArray*)array

{

self.backgroundColor = [UIColor clearColor];

[parentView addSubview:self];

_itemArray = array;

_itemBackView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];

_itemBackView.backgroundColor = [UIColor grayColor];

[self addSubview:_itemBackView];

CGRect frame = [self layoutMenuItem:_itemBackView];

_itemBackView.frame = CGRectMake(_itemBackView.frame.origin.x, _itemBackView.frame.origin.y, frame.size.width, frame.size.height);

_itemBackView.layer.cornerRadius = 10;

}

+(void)showPopView:(UIView *)parentView withRect:(CGRect)rect withMenuItem:(NSArray*)array

{

[[self shareMenuView] showPopView:parentView withRect:rect withMenuItem:array];

}

+(id)shareMenuView

{

static MenuView * menu;

static dispatch_once_t once;

dispatch_once(&once,^{

menu = [[MenuView alloc]init];

});

return menu;

}

/*

// Only override drawRect: if you perform custom drawing.

// An empty implementation adversely affects performance during animation.

- (void)drawRect:(CGRect)rect

{

// Drawing code

}

*/

@end

////////////////////////////////////////////////////////////////////////////////////////////

//调用

-(void)click

{

NSLog(@"click");

NSArray * arr= @[

[MyMenuItem initMenuItemWithTitle:@"点击查看详情" withIcon:[UIImage imageNamed:@"home_icon"] withTarget:self withSelector:(@selector(action1))],

[MyMenuItem initMenuItemWithTitle:@"明日天气预报" withIcon:[UIImage imageNamed:@"home_icon"] withTarget:self withSelector:(@selector(action2))],

[MyMenuItem initMenuItemWithTitle:@"中国人民银行" withIcon:[UIImage imageNamed:@"home_icon"] withTarget:self withSelector:(@selector(action1))],

];

[MenuView showPopView:self.view withRect:CGRectZero withMenuItem:arr];

}

-(void)action1

{

NSLog(@"action1");

}

-(void)action2

{

NSLog(@"action2");

}

本文转自  张江论坛 http://www.999dh.net/home.php?mod=space&uid=1&do=blog&id=205 转自请标注,谢谢~~~

IOS 弹出式 POPMenuView的更多相关文章

  1. web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)

    这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...

  2. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

  3. IOS弹出视图 LewPopupViewController

    LewPopupViewController是一款IOS弹出视图软件.iOS 下的弹出视图.支持iPhone/iPad. 软件截图 使用方法 弹出视图 1 2 3 4 5 PopupView *vie ...

  4. asp.net 弹出式日历控件 选择日期 Calendar控件

    原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...

  5. PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框

    零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提 ...

  6. ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法

    Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面: $ionicPopup是(Dialog)对话框样式的,直接用Ja ...

  7. php弹出式登录窗口并获得登录后返回值

    一款bootstrap样式结合php制作的弹出式登录窗口,输入用户名和密码后,ajax传参给后台,并获得登录后返回值. hwLayer+ajax弹出登录框 $(function() { $('#for ...

  8. 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

    其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...

  9. Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题

    本文主要内容 弹出式线程(Pop-up threads) 使单线程代码多线程化会产生那些问题 一.弹出式线程(Pop-up threads) 以在一个http到达之后一个Service的处理为例子来介 ...

随机推荐

  1. hdu 3951 Coin Game 博弈论

    思路: 当n<=k时,先手必胜: 当k=1时,n为奇数先手胜,否则后手胜: 当k>1时,先手操作之后必定形成链,后手操作后形成二条一样的链,之后,先手怎么操作,后手就怎么操作,则后手必胜. ...

  2. 为什么Android 3.0如此罕见?

    3.0(2011年2月)代号蜂巢,专用于android系统的平板电脑,不用于手机.4.0(2011年5月公布)的开发就是让平板电脑和手机能够共用一个版本的系统.4.0通用于平板电脑和手机.

  3. 欧拉工程第64题:Odd period square roots

    题目链接 找循环位数是奇数的数有多少个 这个自己很难写出来,完全不能暴力 维基百科链接 维基百科上面说的很好,上面的算法实现就好了. 就是上面的 Java程序: package project61; ...

  4. [hackerrank]Closest Number

    https://www.hackerrank.com/contests/w5/challenges/closest-number 简单题. #include <iostream> #inc ...

  5. 【mongoDB基础篇②】PHP-mongo扩展的编译以及使用

    安装PHP-mongo扩展 安装php-mongo扩展和安装其他php扩展的步骤一样: #1.首先上http://pecl.php.net上面搜索mongo,得到下载地址 wget http://pe ...

  6. 从svn删除文件夹和文件

    由于项目开始放在自己项目组的一个服务器上,而且svn也是自己在该服务器上搭建的,但是不知道是什么原因,svn上的代码被误删了.为了更稳定地使用svn,所以使用公司的svn来管理代码. 运维将不是最新版 ...

  7. 如何配置svn服务器

    如果你已经安装好了VisualServer服务器,现在让我们一起来配置svn服务器吧. 工具/原料 VisualServer 配置VisualServer 找到VisualServer Manager ...

  8. 使用 powershell 的 grep 过滤文本

    使用 powershell 的 grep 过滤文本 有个log文件,大小在4M左右,要求找出里面耗时超过100s 的记录.首先想到了强大的 grep ,那么就搞起. 先在网上找一下资料,这篇文章,有几 ...

  9. NLP基本任务-nltk_data文本分割

    将文本分割为句子 nltk.sent_tokenize(text,language) text:需要分割的文本 language:语言种类 czech捷克语 danish丹麦语 dutch荷兰语 en ...

  10. Android权限安全(5)组件的android:exported属性

    Android四大组件都有 android:exported 属性 android:exported="true" 时 表示该组件是公开的,其它组件可以访问这个组件 android ...