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 颜色数组

  • 相关阅读:
    [考试反思]0511省选模拟93:平衡
    [考试反思]0509省选模拟92:警示
    [考试反思]0508省选模拟91:小雨
    [考试反思]0507省选模拟90:信任
    [考试反思]0506省选模拟89:无事
    [专题总结]2-sat及题目&题解(3/5 complete)
    [考试反思]0505省选模拟88:滑稽
    [考试反思]0504省选模拟87:开花
    [考试反思]0502省选模拟86:恐惧
    [考试反思]0501省选模拟85:低落
  • 原文地址:https://www.cnblogs.com/sunfuyou/p/7542864.html
Copyright © 2011-2022 走看看