UIKit框架里的能夠支持復制的,很自然就會想到UITextView、UITextField、UIWebView。但是有一次我在做項目的時候,碰到了這樣一個問題,之前用作展示的訂單流水號(很長很長的那種),忽然有一天想copy給服務端進行對賬查詢。為了支持復制,把原本寫好的Label換成UITextField,改動會比較大。所以我就研究了如何讓UILabel支持復制。
一. 自定義LYCopyLabel,繼承自UILabel
//
// LYCopyLabel.h
// 11-長按復制
//
// Created by yzfx-sh-liuyan on 2017/2/16.
// Copyright ? 2017年 chris. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface LYCopyLabel : UILabel
@end
二. 具體實現(xiàn)步驟
- 1、 添加手勢事件,設置手勢響應時間
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
[self pressAction];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
if (self = [super initWithCoder:aDecoder]) {
[self pressAction];
}
return self;
}
- (void)pressAction{
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
gesture.minimumPressDuration = 1;
[self addGestureRecognizer:gesture];
}
- 2、實現(xiàn)手勢處理事件
- (void)longPressAction:(UIGestureRecognizer *)recognizer{
[self becomeFirstResponder];
UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"拷貝" action:@selector(customCopy:)];
//UIMenuController:可以通過這個類實現(xiàn)在點擊內容,每個選項都是一個UIMenuItem對象
[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:copyItem, nil]];
[[UIMenuController sharedMenuController] setTargetRect:self.frame inView:self.superview];
[[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
}
- (void)customCopy:(id)sender {
//UIPasteboard 該類支持寫入和讀取數(shù)據(jù),類似剪貼板,除了字符串,也可以拷貝圖片,URL
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.text;
}
寫完上面的,點擊運行后,長按Lebel并不會像UITextfield一樣彈出拷貝字樣,相反他什么動作也沒有?。。?/p>
- 3、 重寫父類方法,使UILabel成為響應者
#pragma mark - 重寫UIResponder
//讓label能夠成為響應事件
- (BOOL)canBecomeFirstResponder{
return YES;
}
**需要說明的是:**
在當上第一響應對象時,不同對象可能會有一些特殊的表現(xiàn)。例如UITextField當上的時
候,就會調出一塊小鍵盤。
- 4、 控制哪些事件可以響應
//控制響應的事件
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return action == @selector(customCopy:);
}