iOS创建支持长按复制的Label控件

简介: iOS创建支持长按复制的Label控件

前言

实现原理

CopyTextLabel 通过将canPerformCopyAction置为YES来开启长按复制文本的功能。

效果

image.png

先了解一下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

see also


目录
相关文章
|
8月前
|
iOS开发
iOS 多个滚动控件嵌套Demo
iOS 多个滚动控件嵌套Demo
39 0
|
12月前
|
iOS开发
iOS短信验证码控件,自动输入回调两次解决办法
iOS短信验证码控件,自动输入回调两次解决办法
326 0
|
iOS开发
IOS的UITableView控件简单使用
IOS的UITableView控件简单使用
127 0
|
存储 数据安全/隐私保护 开发者
iOS创建苹果证书、制作p12证书流程
iOS创建苹果证书、制作p12证书流程
iOS创建苹果证书、制作p12证书流程
|
iOS开发
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
130 0
iOS开发 - 写一个刷新的控件(未封装,适合新手学习,查看原理)
|
安全 数据安全/隐私保护 iOS开发
uniapp开发,window下创建ios打包证书的详情流程
uniapp开发,window下创建ios打包证书的详情流程
|
iOS开发
iOS开发-加在透明视图上的控件会透明
iOS开发-加在透明视图上的控件会透明
116 0
|
安全 iOS开发
iOS小技能:下拉刷新控件的适配
1. 下拉顶部背景色设置: 往tableView的父控件添加拉伸背景视图 2. present 半屏适配 iOS13 modalPresentationStyle属性默认不是全屏样式`UIModalPresentationFullScreen`,而是半屏样式,需要根据需求手动设置。 present 半屏,会导致列表下拉刷新失效。
160 0
iOS小技能:下拉刷新控件的适配
|
iOS开发
iOS小技能:自动布局实现兄弟控件N等分且宽高比例是1:N(xib 上实现)
本文为 iOS视图约束专题的第三篇:xib上使用自动布局教程
142 0
|
前端开发 iOS开发
React Native | 创建IOS原生模块
React Native | 创建IOS原生模块
325 0