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 啦