iOS中UILabel实现长按复制功能实例代码

前言

网上有很多种给Label添加长按复制功能的方法,而在 UILabel 上实现长按复制,我用的是 UIMenuController。在 UITextView、UITextField 中,已经自带了这个东西,但是在 UILabel 上需要自定义。

鉴于有的朋友很少接触 UIMenuController,这里先介绍一些基本知识。

UIMenuController 可以使用系统自带的方法,也可以自定义。

系统默认支持UITextField、UITextView、UIWebView控件的UIMenuController相关操作

更多UIMenuController使用请参考这篇文章:http://www.jb51.net/article/87000.htm

常见的系统方法和使用

- (void)cut:(nullable id)sender NS_AVAILABLE_IOS(3_0);
- (void)copy:(nullable id)sender NS_AVAILABLE_IOS(3_0);
- (void)paste:(nullable id)sender NS_AVAILABLE_IOS(3_0);
- (void)select:(nullable id)sender NS_AVAILABLE_IOS(3_0);
- (void)selectAll:(nullable id)sender NS_AVAILABLE_IOS(3_0);
- (void)delete:(nullable id)sender NS_AVAILABLE_IOS(3_2);

从字面意思就能看出,他们是剪切、复制、粘贴、选择、全选、删除。使用方法很简单。

// 比如我在一个 UITextView 里,想增加全选和复制的方法
// 只要在自定义 UITextView 的时候加入这行代码即可
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
 if(action == @selector(selectAll:) || action == @selector(copy:)) return YES;
 return NO;
}

细心的朋友可能会发现,最后长按出来的文字都是英文,我们改如何把他改成中文呢?如图,在 Project -> Info -> Localizations 中添加 Chinese(Simplified) 即可。

自定义方法和使用

回到主题,我们要在 UILabel 上加入长按复制事件,但是他本身是不支持 UIMenuController 的,所以接下来讲讲自定义方法。

自定义一个 UILabel,设置label可以成为第一响应者

- (BOOL)canBecomeFirstResponder {
 return YES;
}

设置长按事件,在初始化的时候调用这个方法

- (void)setUp {
 /* 你可以在这里添加一些代码,比如字体、居中、夜间模式等 */
 self.userInteractionEnabled = YES;
 [self addGestureRecognizer:[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress)]];
}

长按事件,在里面新建 UIMenuController

- (void)longPress {

 // 设置label为第一响应者
 [self becomeFirstResponder];

 // 自定义 UIMenuController
 UIMenuController * menu = [UIMenuController sharedMenuController];
 UIMenuItem * item1 = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(copyText:)];
 menu.menuItems = @[item1];
 [menu setTargetRect:self.bounds inView:self];
 [menu setMenuVisible:YES animated:YES];
}

设置label能够执行那些

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
 if(action == @selector(copyText:)) return YES;
 return NO;
}

// 如果模仿上面的写以下代码,点击后会导致程序崩溃
if(action == @selector(selectAll:) || action == @selector(copy:)) return YES; 

方法的具体实现

- (void)copyText:(UIMenuController *)menu {
 // 没有文字时结束方法
 if (!self.text) return;
 // 复制文字到剪切板
 UIPasteboard * paste = [UIPasteboard generalPasteboard];
 paste.string = self.text;

}

最终效果:

附上 DEMO (本地下载),自定义的 UILabel 可以直接拖走使用

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS长按UIlabel实现可复制功能

    前言 相信大家都知道在iOS中有三个控件自身是支持拷贝,粘贴的,如:UITextField,UITextView,UIWebView.但是,有时候我们会遇到需要长按UIlabel,弹出"复制"item,来实现可复制.那该怎么办呢?下面就来一起看看吧. 首先UIKit中提供给我们几个类 在开始之前,我们需要自定义一个WINCopyLabel继承UILable - (instancetype)initWithFrame:(CGRect)frame { if (self = [super i

  • iOS中UILabel实现长按复制功能实例代码

    前言 网上有很多种给Label添加长按复制功能的方法,而在 UILabel 上实现长按复制,我用的是 UIMenuController.在 UITextView.UITextField 中,已经自带了这个东西,但是在 UILabel 上需要自定义. 鉴于有的朋友很少接触 UIMenuController,这里先介绍一些基本知识. UIMenuController 可以使用系统自带的方法,也可以自定义. 系统默认支持UITextField.UITextView.UIWebView控件的UIMenu

  • iOS中UILabel text两边对齐的实现代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: -(NSAttributedString *)setTextString:(NSString *)text { NSMutableAttributedString *mAbStr = [[NSMutableAttributedString alloc] initWithString:text]; NSMutableParagraphStyle *npgStyle = [[NSMutableParagraphStyle alloc] init]

  • iOS中时间与时间戳的相互转化实例代码

    本人搜索了很多关于iOS中时间与时间戳的相互转化的资料,下面我来记录一下,有需要了解iOS中时间与时间戳的相互转化的朋友可参考.希望此文章对各位有所帮助. //获取当前系统时间的时间戳 #pragma mark - 获取当前时间的 时间戳 +(NSInteger)getNowTimestamp{ NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateStyle:NSDateFormatterM

  • IOS中计算缓存文件的大小判断实例详解

    IOS中计算缓存文件的大小判断实例详解 IOS中计算缓存文件的大小判断,在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 实例代码: //获取缓存文件路径 -(NSString *)getCachesPath{ // 获取Caches目录路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCaches

  • iOS开发中Swift 指纹验证功能模块实例代码

    iOS调用TouchID代码: override func viewDidLoad() { super.viewDidLoad() let context = LAContext() var error: NSError? = nil let canEvaluatePolicy = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) as Bool if error

  • iOS中UILabel设置居上对齐、居中对齐、居下对齐及文字置顶显示

    iOS中UILabel设置居上对齐.居中对齐.居下对齐 在iOS中默认的UILabel中的文字在竖直方向上只能居中对齐,博主参考国外网站,从UILabel继承了一个新类,实现了居上对齐,居中对齐,居下对齐. 具体如下: // // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13. // Copyright (c) 2013 yexiaozi_007. All rights reserved. // #import <UIKit/UIK

  • iOS利用UIScrollView实现图片的缩放实例代码

    本文介绍了iOS利用UIScrollView实现图片的缩放实例代码,分享给大家: 第一步:添加scrollView到控制器中 UIScrollView *scrollView = [[UIScrollView alloc] init]; scrollView.frame = CGRectMake(40, 250, 300, 200); self.scrollView = scrollView; [self.view addSubview:scrollView]; 第二步:添加图片控件到scrol

  • IOS开发实现手机震动的提示实例代码

    IOS开发实现手机震动的提示实例代码 我们都知道手机有震动功能,其实呢,这个功能实现起来特别的简单,我们只需要用到几个函数就可以了: - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event - (void)motionCancelled:(UIEventSubtype)mot

  • Android仿微信单击拍照长按录像功能实例代码

    此文章是看郭神公众号发的一篇,仅作学习. 在modlue gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 在project gradle中添加 compile 'cjt.library.wheel:camera:0.0.7' 添加的地方是 allprojects { repositories { jcenter() /*在此处添加*/ } } 使用起来很方便,只需在xml布局中 <com.cjt2325.cameralibrary.JCame

  • iOS 设置导航条透明效果的实例代码

    APP中很多界面都是这样的.从有不透明到透明,透明到不透明 以下代码即可实现该功能 //设置导航栏透明 func setNavigationIsTranslucent(isTranslucent:Bool) { if isTranslucent == true { self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) self.navigationController?.navi

随机推荐