前言
实现原理
CopyTextLabel 通过将canPerformCopyAction置为YES来开启长按复制文本的功能。
效果
先了解一下UILabel的基本用法
I、UILabel的基本用法
1.1 显示模式
- NSLineBreakByWordWrapping = 0,
单词包裹,换行的时候会以一个单词换行
- NSLineBreakByCharWrapping,
字符包裹换行,换行的时候会以一个字符换行
- NSLineBreakByClipping,
裁剪超出的内容
- NSLineBreakByTruncatingHead,
一行中头部省略(注意:numberOfLines要为1): "...#公众号:iOS逆向"
- NSLineBreakByTruncatingTail,
一行中尾部省略: "#公众号:iOS逆向..."
- NSLineBreakByTruncatingMiddle
一行中中间部省略: "#公众号:...iOS逆向."
1.2 例子:一行中头部省略
- (void)iOSDevloperLearn4UILabel{ // 1.1 创建UILabel对象 UILabel *label = [[UILabel alloc] init]; // 1.2 设置frame label.frame = CGRectMake(100, 100, 202, 175); // 1.3 设置背景颜色 label.backgroundColor = [UIColor redColor]; // 1.4 设置文字 label.text = @"公众号:iOS逆向"; label.text = @"博客地址:https://kunnan.blog.csdn.net #公众号:iOS逆向 "; // 1.5 居中 label.textAlignment = NSTextAlignmentCenter; // 1.6 设置字体大小 label.font = [UIFont systemFontOfSize:20.f]; label.font = [UIFont boldSystemFontOfSize:25.f]; label.font = [UIFont italicSystemFontOfSize:20.f]; // 1.7 设置文字的颜色 label.textColor = [UIColor whiteColor]; // 1.8 设置阴影(默认是有值) label.shadowColor = [UIColor blackColor]; label.shadowOffset = CGSizeMake(-2, 1); // 1.9 设置行数(0:自动换行) label.numberOfLines = 1; // 1.10 显示模式 label.lineBreakMode = NSLineBreakByTruncatingHead; /* NSLineBreakByWordWrapping = 0, // 单词包裹,换行的时候会以一个单词换行 NSLineBreakByCharWrapping, // 字符包裹换行,换行的时候会以一个字符换行 NSLineBreakByClipping, // 裁剪超出的内容 NSLineBreakByTruncatingHead, // 一行中头部省略(注意:numberOfLines要为1): "...wxyz" NSLineBreakByTruncatingTail, // 一行中尾部省略: "abcd..." NSLineBreakByTruncatingMiddle // 一行中中间部省略: "ab...yz" */ // 2.0 添加到控制器的view中 [self.view addSubview:label]; }
II、 案例:实现长按复制文本的功能
2.1 实现步骤
CopyTextLabel 通过将canPerformCopyAction
置为YES
来开启长按复制文本的功能。并自定义 UIMenuController来处理事件
2.2 具体的代码
- h
#import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface QCTCopyLabel : UILabel - (instancetype)init; @end
- m
// // QCTCopyTextLabel.m // retail // // Created by mac on 2020/1/17. // Copyright © 2020 QCT. All rights reserved. // #import "QCTCopyTextLabel.h" @implementation QCTCopyTextLabel /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setUp]; } return self; } - (instancetype)init { self = [super init]; if (self) { [self setUp]; } return self; } // 设置label可以成为第一响应者 - (BOOL)canBecomeFirstResponder { return YES; } // 设置长按事件 - (void)setUp { /* 你可以在这里添加一些代码,比如字体、居中、夜间模式等 */ self.userInteractionEnabled = YES; [self addGestureRecognizer:[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress)]]; } // 长按事件 - (void)longPress { // 设置label为第一响应者 [self becomeFirstResponder]; // 自定义 UIMenuController UIMenuController * menu = [UIMenuController sharedMenuController]; UIMenuItem * item1 = [[UIMenuItem alloc]initWithTitle:QCTLocal(@"copy") 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; } // 复制方法 - (void)copyText:(UIMenuController *)menu { // 没有文字时结束方法 if (!self.text) return; // 复制文字到剪切板 UIPasteboard * paste = [UIPasteboard generalPasteboard]; paste.string = self.text; } @end