UIMenuController 注意事项 OC与swift4.0

UIMenuController  是什么?

简单来说 就是我们常看到的  Textfiled  textView  webView 上面 当你 长按的时候 会有 弹出一长串 复制 粘粘  类似于 qq聊天 对应的详细 你查看的时候 会有复制 转发 那个 view.


好 先来 OC

1. 是 让 添加  UIMenuController 的控件 成为 响应者 *

- (BOOL)canBecomeFirstResponder{

returnYES;

}

2 重点来了 必须实现下面俩方法 这俩方法 一般写在 UIMenuController 创建的类 里面

- (BOOL)canBecomeFirstResponder{

      return YES;

}

//不要急 这个方法里面的 俩个selector 是 创建 UIMenuItem 的两个方法  是 确保 这俩个方法 才会触发  能够点击  否则  其他的 都不触发

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{

if(action ==@selector(copy:) || action ==@selector(paste:) || action ==@selector(cut:)) {

        return YES; 

 }

          returnNO;

}

3.  UIMenuController  的创建

UIMenuController*menuVc = [UIMenuController sharedMenuController];

if(menuVc.isMenuVisible) { 

 [menuVc setMenuVisible:NO animated:YES];

 }

//self.frame 是你 需要添加 删除 粘贴  UIMenuController 的控件的frame self.superview 其父视图的 frame

 [menuVc setTargetRect:self.frame inView:self.superview];

//使  UIMenuController 可见

 [menuVc setMenuVisible:YES animated:YES];

//自定义 的 item 就是 自定义 粘粘啊 删除啊 还是 其他的item

UIMenuItem*item1 = [[UIMenuItem alloc] initWithTitle:@"item1"action:@selector(item1Click:)];

UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"item2"action:@selector(item2Click:)]; 

//这个就是 把 item 放到 menuVC上

menuVc.menuItems = @[item1,item2];

最后 实现方法 menitems 方法就好了 方法里面 具体做什么 看自己业务 

注意  这个是 把  我们的 字符串 复制到 我们的硬件中 在其他地方可以粘粘

UIPasteboard*board = [UIPasteboardgeneral Pasteboard];

 board.string ="复制到手机硬件中";

综上  oc的 代码  封装的 label

#import"LXBLabel.h"

@implementationLXBLabel

- (instancetype)initWithFrame:(CGRect)frame{

self= [superinitWithFrame:frame];

if(self) {

 [selfsetup]; }returnself;

}

- (void)awakeFromNib{ [selfsetup];

}

- (void)setup{

self.userInteractionEnabled =YES;

 [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickLabel)]];

}

- (void)clickLabel{ 

[self becomeFirstResponder];

UIMenuController*menuVc =[UIMenuController  sharedMenuController];// 控制好menu的显示与隐藏UIMenuController*menuVc = [UIMenuController sharedMenuController];

if(menuVc.isMenuVisible) { 

 [menuVc setMenuVisible:NO animated:YES]; 

 }

 [menuVc setTargetRect:self.frame inView:self.superview];

 [menuVc setMenuVisible:YES animated:YES];}

UIMenuItem*item1 = [[UIMenuItem alloc] initWithTitle:@"复制"action:@selector(copy:)];

UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"粘粘"action:@selector(paste:)]; 

UIMenuItem*item2 = [[UIMenuItem alloc] initWithTitle:@"剪贴"action:@selector(cut:)];

menuVc.menuItems = @[item1,item2];


- (BOOL)canBecomeFirstResponder{

// 明确该控件可以成为第一响应者 returnYES;

}

// 该控件可以执行哪些动作

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{

if(action ==@selector(copy:) || action ==@selector(paste:) || action ==@selector(cut:)) {

returnYES;

 }

returnNO;

}

- (void)copy:(UIMenuController*)menu{

UIPasteboard*board = [UIPasteboardgeneral Pasteboard]; 

 board.string =self.text;

 }

- (void)paste:(UIMenuController*)menu{

UIPasteboard*board = [UIPasteboardgeneral Pasteboard];

self.text = board.string;


}- (void)cut:(UIMenuController*)menu{

 [self copy:menu];

self.text =nil;

}

@end



swfit  与 OC 类似 就是写法 不同

```//

//  headerView.swift

//  MENEDEMO

//

//  Created by wwt on 2018/6/6.

//  Copyright © 2018年 wwt. All rights reserved.

//

import UIKit

class headerView: UIView {

    var label :UILabel?

    override init(frame: CGRect) {

        super.init(frame: frame)


        label = UILabel.init(frame: CGRect.init(x: 5, y: 5, width: frame.width - 10, height: frame.height - 10))

        label?.text = "sadasdasdsad"


        label?.font = UIFont.systemFont(ofSize: 15)

        label?.textColor = UIColor.red

        label?.isUserInteractionEnabled = true

        let lpgr = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress))

        lpgr.minimumPressDuration = 0.5

        label?.addGestureRecognizer(lpgr)

        self.becomeFirstResponder()

        addSubview(label!)


    }



    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    /*

    // Only override draw() if you perform custom drawing.

    // An empty implementation adversely affects performance during animation.

    override func draw(_ rect: CGRect) {

        // Drawing code

    }

    */


    public lazy var menuController: UIMenuController = {


        return UIMenuController.shared

    }()

    lazy var copyMenuItem: UIMenuItem = {

        return UIMenuItem(title:"复制", action:#selector(copyMenuAction))

    }()

    lazy var pasteMenuItem: UIMenuItem = {

        return UIMenuItem(title:"粘贴", action:#selector(pasteMenuAction))

    }()


}

extension headerView {


    override var canBecomeFirstResponder: Bool {


        return true


    }


    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {

        if [#selector(copyMenuAction), #selector(pasteMenuAction)].contains(action) {

            return true

        }

        return false

    }

    @objc func handleLongPress (_ recognizer: UILongPressGestureRecognizer){


      // if recognizer.state == .began {


            self.becomeFirstResponder()

            label?.becomeFirstResponder()

            menuController.menuItems = [copyMenuItem]

            menuController.setTargetRect((label?.frame)!, in: (label?.superview)!)

            menuController.setMenuVisible(true, animated: true)

  //      }


    }



    class func showAlert(_ t:String? = nil, message:String?,leftButtonTitle:String,rightButtonTitle:String? = nil, leftBtnSureClick:(() -> Void)? = nil, rightCancleBtnClick:(() -> Void)? = nil) {


        DispatchQueue.main.async(execute: { () -> Void in

            var title = t

            if title == nil {


                title = "";

            }


            let alertVC = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert);

            alertVC.addAction(UIAlertAction(title: leftButtonTitle, style: UIAlertActionStyle.default, handler: { (sure) -> Void in


                if leftBtnSureClick != nil {


                    leftBtnSureClick!();

                }


            }))

            if rightButtonTitle != nil {


                alertVC.addAction(UIAlertAction(title: rightButtonTitle, style: UIAlertActionStyle.default, handler: { (cancle) -> Void in


                    if rightCancleBtnClick != nil {


                        rightCancleBtnClick!();

                    }


                }))

            }



            let vc =  UIApplication.shared.keyWindow?.rootViewController;


            if vc != nil {


            }

            if ((vc?.presentedViewController) != nil) {

                vc?.presentedViewController!.present(alertVC, animated: true, completion: nil);

                return;


            }

            vc?.present(alertVC, animated: true, completion: nil);

        })

    }


    @objc func copyMenuAction() {

        headerView.showAlert("提示", message: "复制", leftButtonTitle: "是", rightButtonTitle: "否", leftBtnSureClick: {


        }) {


        }

    }

    @objc func pasteMenuAction (){

      headerView.showAlert(message: "提示", leftButtonTitle: "知道了")

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容