实现原理
CopyTextLabel 通过将canPerformCopyAction置为YES来开启长按复制文本的功能。
效果
在这里插入图片描述
先了解一下UILabel的基本用法
单词包裹,换行的时候会以一个单词换行
字符包裹换行,换行的时候会以一个字符换行
裁剪超出的内容
一行中头部省略(注意:numberOfLines要为1): "...#公众号:iOS逆向"
一行中尾部省略: "#公众号:iOS逆向..."
一行中中间部省略: "#公众号:...iOS逆向."
在这里插入图片描述
- (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];
}
CopyTextLabel 通过将canPerformCopyAction
置为YES
来开启长按复制文本的功能。并自定义 UIMenuController来处理事件
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface QCTCopyLabel : UILabel
- (instancetype)init;
@end
//
// 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