一般当我们开发一款具备聊天性质的app时,比如像qq会话框一样,长按转发,复制等功能时少不了的,现在我就来讲一下UIMenuItem的用法。其实这个很简单,我写了一个简单的demo。我就直接上代码了,在代码里面写好说明。
//
// ViewController.m
// UIMenuItem的用法
//
// Created by huasu on 16/7/28.
// Copyright © 2016年 JY. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,weak)UIButton *btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
btn.backgroundColor=[UIColor redColor];
btn.frame=CGRectMake(50, 100, 250, 50);
[self.view addSubview:btn];
self.btn=btn;
//添加手势,UILongPressGestureRecognizer长按手势,一般加载cell的内容btn上的比较多
[btn addGestureRecognizer: [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longTap:)]];
}
-(void)longTap:(UILongPressGestureRecognizer *)longRecognizer
{
if (longRecognizer.state==UIGestureRecognizerStateBegan) {//判断手势是不是已经开始的时候触发UIMenuItem,一般使用UIGestureRecognizerStateEnded这个,这个是长按手势结束后,也就是手指长按之后松开,UIGestureRecognizerStateBegan这个是长按手势开始就触发
[self becomeFirstResponder];
UIMenuItem *resendItem = [[UIMenuItem alloc] initWithTitle:@"转发" action:@selector(resendItemClicked:)];
UIMenuItem *resendItem1 = [[UIMenuItem alloc] initWithTitle:@"说明" action:@selector(resendItemClicked:)];
UIMenuController *menu=[UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:resendItem,resendItem1,nil]];
//UIMenuController出现的位置,一般如果在tableview里面用的话,这个就是我们的cell内容btn的bounds inview也就是cell内容的btn
[menu setTargetRect:self.btn.bounds inView:self.btn];
[menu setMenuVisible:YES animated:YES];
[menu setArrowDirection:UIMenuControllerArrowDefault];//样式
}
}
-(void)resendItemClicked:(id)sender{
NSLog(@"转发");
}
//下面这两个方法必须加上,否则长安手势不会弹出框
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{
if (action==@selector(resendItemClicked:)){
return YES;
}
return [super canPerformAction:action withSender:sender];
}
-(BOOL)canBecomeFirstResponder{
return YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end