UIMenuItem的用法

一般当我们开发一款具备聊天性质的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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个功能可以通过以下步骤实现: 1. 在图片上添加一个长按手势识别器,当用户长按图片时触发该手势识别器。 2. 在手势识别器的回调方法中,创建一个 UIMenuController,并设置其代理为当前视图控制器。 3. 在代理方法中,根据菜单项的标题执行相应的操作,比如旋转图片。可以使用 CGAffineTransformMakeRotation 函数来实现图片的旋转。 4. 在菜单项执行完操作后,需要将 UIMenuController 隐藏起来,以免影响用户体验。 下面是实现代码的示例: ```swift // 添加长按手势识别器 let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:))) imageView.addGestureRecognizer(longPressRecognizer) // 长按手势识别器的回调方法 @objc func handleLongPress(_ recognizer: UILongPressGestureRecognizer) { if recognizer.state == .began { // 创建菜单控制器 let menuController = UIMenuController.shared menuController.setTargetRect(imageView.frame, in: view) menuController.arrowDirection = .default menuController.setMenuVisible(true, animated: true) menuController.menuItems = [ UIMenuItem(title: "图片重置", action: #selector(resetImage)), UIMenuItem(title: "图片向右旋转30度", action: #selector(rotateImage30)), UIMenuItem(title: "图片向右旋转90度", action: #selector(rotateImage90)), UIMenuItem(title: "图片向右旋转180度", action: #selector(rotateImage180)) ] menuController.update() } } // 菜单控制器的代理方法 override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if action == #selector(resetImage) || action == #selector(rotateImage30) || action == #selector(rotateImage90) || action == #selector(rotateImage180) { return true } else { return false } } override func validate(_ menuItem: UIMenuItem) -> Bool { return true } override func didTap(_ menuItem: UIMenuItem) { // 执行菜单项对应的操作 if menuItem.action == #selector(resetImage) { imageView.transform = .identity } else if menuItem.action == #selector(rotateImage30) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 6) } else if menuItem.action == #selector(rotateImage90) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) } else if menuItem.action == #selector(rotateImage180) { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } // 隐藏菜单控制器 UIMenuController.shared.setMenuVisible(false, animated: true) } // 菜单项对应的操作方法 @objc func resetImage() { imageView.transform = .identity } @objc func rotateImage30() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 6) } @objc func rotateImage90() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi / 2) } @objc func rotateImage180() { imageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值