iOS 给Label实现一个简单的复制 UIMenuContro

2021-06-17  本文已影响0人  JasonFive

给Label实现一个简单的复制,直接来代码

- (void)initSubview
{
   // 第一步:添加长按手势
   UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(copyLogisticsAddress)];
   [self.logisticsInfoLabel addGestureRecognizer:longPressGesture];
   self.logisticsInfoLabel.userInteractionEnabled = YES;
}

// 第二步:使Label能成为第一响应者
- (BOOL)canBecomeFirstResponder
{
   return YES;
}

- (void)copyLogisticsAddress
{
   // 第三步:设置第一响应者(必须要有这一步,不然Menu不显示)
   [self becomeFirstResponder];
   
   // 初始化 Menu
   UIMenuController *menu = [UIMenuController sharedMenuController];
   
   // 判断 Menu是否显示,因为这个手势会调多次
   if (menu.isMenuVisible) return;
   
   // 设置 复制Item,每一个选项都是一个 UIMenuItem 对象
   UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copyAddress)];
   
   [menu setMenuItems:@[copyItem]]; // 设置
   
   // 设置点击区域和显示位置(这里设置为 SuperView 让它显示在 Label 正上方,不然会显示在 Label 右下角)
   [menu setTargetRect:self.logisticsInfoLabel.frame inView:self.logisticsInfoLabel.superview];
   
   // 显示
   [menu setMenuVisible:YES animated:YES];
}

// 第四步: 设置Label能具体执行的哪些方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
   return (action == @selector(copyAddress));
}

// 第五步:复制到剪切板
- (void)copyAddress
{
   UIPasteboard *board = [UIPasteboard generalPasteboard];
   board.string = self.logisticsInfoLabel.text;
}

// 第六步:隐藏 Menu ,这一步可要可不要
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
   [[UIMenuController sharedMenuController] setMenuVisible:NO];
}

O 啦

上一篇下一篇

猜你喜欢

热点阅读