zoukankan      html  css  js  c++  java
  • ios label 简单的长按复制文本信息

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能。网上有很多种给Label添加长按复制功能的方法,这里我就写分享一种简单的写法,直接在控制器Label需要使用的地方直接实现,也不再进行封装处理。

    首先,苹果系统中支持复制功能的控件只有三种:UItextView、UItextfield、UIWebView,所以要想让UILabel支持复制功能,只能给UILabel添加点击手势(比如:长按手势)才能复制内容。

    长按复制弹出来的是一个UImenucontroller,那就需要给UILabel添加一个长按的手势识别(UILongPressGestureRecognizer),并在系统识别出这个手势之后添加相关的相应动作(action)。在这之前,需要让UILabel成为第一响应者,但是需要注意的是,不是所有的UILabel都能成为第一响应者,这就需要重写canBecomeFirstResponder方法,获取到UILabel的关联对象numberToSwitchCopy的布尔值,根据这个布尔值来决定UILabel是否能成为第一响应者,如果没有设置这个关联对象的UILabel是不可能成为第一响应者的。

    系统识别到长按动作之后,就执行处理长按事件的方法,在这个方法中,使UILabel成为第一响应者(UIMenuController的要求,要显示UIMenuController对象的UIView必须为当前UIWindow的第一响应者),然后为UIMenuController设置UIMenuItem对象,设置显示区域,最后将UIMenuController设置为可见。与此同时,如果只在UImenuitem的action中写了方法名但是没有实现action方法,UImenucontroller也是不会显示出来的。

    在copy:方法中,完成将选中的文字复制到系统的粘贴板中,首先获取系统的粘贴板UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];,然后将所需复制的文字赋值给pasteBoard的String属性。需要注意的是pasteBoard的String属性只能接受NSString类型的值,如果UILabel中的文字是NSAtrributedString,就要转换成NSString再赋值。

    说了这么多,直接附上一个小例子,以便参考研究。我直接在控制器里面直接给Label添加长按手势复制内容的,这里附上的是控制器的类文件。

    .h 文件:

    #import <UIKit/UIKit.h>
    #import "ViewController.h"
    @interface TestViewController : UIViewController
    @end

    .m文件:

    #import "TestViewController.h"
    @interface TestViewController ()
    @property (nonatomic,strong) UILabel *aaa;
    @end
    @implementation TestViewController
    - (void)viewDidLoad {
    [super viewDidLoad];
    [self initUI];
    }

    - (void)initUI {
    self.aaa = [[UILabel alloc] initWithFrame:CGRectMake(0, 300+45+5, 300, 20)];
    self.aaa.backgroundColor = [UIColor yellowColor];
    self.aaa.text = @"三掌柜666";

    //UILabel自身不能接收事件,需要开发者给它添加长按事件
    self.aaa.userInteractionEnabled = YES;
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPre:)];
    [self.aaa addGestureRecognizer:longPress];
    [self.view addSubview:self.aaa];

    }
    // 使label能够成为响应事件,为了能接收到事件(能成为第一响应者)
    - (BOOL)canBecomeFirstResponder{
    return YES;
    }
    // 可以控制响应的方法
    - (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    return (action == @selector(copy:));
    }
    //针对响应方法的实现,最主要的复制的两句代码
    - (void)copy:(id)sender{

    //UIPasteboard:该类支持写入和读取数据,类似剪贴板
    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
    pasteBoard.string = self.aaa.text;
    }
    // 处理长按事件
    - (void)longPre:(UILongPressGestureRecognizer *)recognizer{
    [self becomeFirstResponder]; // 用于UIMenuController显示,缺一不可

    //UIMenuController:可以通过这个类实现点击内容,或者长按内容时展示出复制等选择的项,每个选项都是一个UIMenuItem对象
    UIMenuItem *copyLink = [[UIMenuItem alloc] initWithTitle:@"复制" action:@selector(copy:)];
    [[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyLink, nil]];
    [[UIMenuController sharedMenuController] setTargetRect:self.aaa.frame inView:self.aaa.superview];
    [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
    }
    - (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    }

    下面是局部运行效果:

    补充知识:

    (一)、UIResponderStandardEditActions:这是苹果给NSObject写的一个分类,其中包含了我们常用的复制,粘贴,全选等方法.

    1  - (void)cut:(nullable id)sender NS_AVAILABLE_IOS(3_0);
    2  - (void)copy:(nullable id)sender NS_AVAILABLE_IOS(3_0);
    3  - (void)paste:(nullable id)sender NS_AVAILABLE_IOS(3_0);
    4  - (void)select:(nullable id)sender NS_AVAILABLE_IOS(3_0);
    5  - (void)selectAll:(nullable id)sender NS_AVAILABLE_IOS(3_0);
    6  - (void)delete:(nullable id)sender NS_AVAILABLE_IOS(3_2);

    当我们选中弹出的item的时候,系统会调用上面对应的方法,进行对应的操作。

    (二)、剪贴板中可以放置的内容(除了字符串,还可以拷贝图片、URL等).

    1.  UIPasteboardTypeListString 字符串数组, 包含kUTTypeUTF8PlainText
    2.  UIPasteboardTypeListURL URL数组,包含kUTTypeURL
    3.  UIPasteboardTypeListImage 图形数组, 包含kUTTypePNG 和kUTTypeJPEG
    4.  UIPasteboardTypeListColor 颜色数组

  • 相关阅读:
    Read-Copy Update Implementation For Non-Cache-Coherent Systems
    10 华电内部文档搜索系统 search04
    10 华电内部文档搜索系统 search05
    lucene4
    10 华电内部文档搜索系统 search01
    01 lucene基础 北风网项目培训 Lucene实践课程 索引
    01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
    01 lucene基础 北风网项目培训 Lucene实践课程 Lucene概述
    第五章 大数据平台与技术 第13讲 NoSQL数据库
    第五章 大数据平台与技术 第12讲 大数据处理平台Spark
  • 原文地址:https://www.cnblogs.com/sunfuyou/p/7542864.html
Copyright © 2011-2022 走看看