UIKit框架里的能夠支持復(fù)制的熬词,很自然就會(huì)想到UITextView吸重、UITextField、UIWebView嚎幸。但是有一次我在做項(xiàng)目的時(shí)候,碰到了這樣一個(gè)問(wèn)題嫉晶,之前用作展示的訂單流水號(hào)(很長(zhǎng)很長(zhǎng)的那種)骑疆,忽然有一天想copy給服務(wù)端進(jìn)行對(duì)賬查詢。為了支持復(fù)制车遂,把原本寫(xiě)好的Label換成UITextField封断,改動(dòng)會(huì)比較大。所以我就研究了如何讓UILabel支持復(fù)制舶担。
一. 自定義LYCopyLabel坡疼,繼承自UILabel
//
// LYCopyLabel.h
// 11-長(zhǎng)按復(fù)制
//
// Created by yzfx-sh-liuyan on 2017/2/16.
// Copyright ? 2017年 chris. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface LYCopyLabel : UILabel
@end
二. 具體實(shí)現(xiàn)步驟
- 1、 添加手勢(shì)事件衣陶,設(shè)置手勢(shì)響應(yīng)時(shí)間
- (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柄瑰、實(shí)現(xiàn)手勢(shì)處理事件
- (void)longPressAction:(UIGestureRecognizer *)recognizer{
[self becomeFirstResponder];
UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"拷貝" action:@selector(customCopy:)];
//UIMenuController:可以通過(guò)這個(gè)類實(shí)現(xiàn)在點(diǎn)擊內(nèi)容闸氮,每個(gè)選項(xiàng)都是一個(gè)UIMenuItem對(duì)象
[[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 該類支持寫(xiě)入和讀取數(shù)據(jù),類似剪貼板,除了字符串教沾,也可以拷貝圖片蒲跨,URL
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = self.text;
}
寫(xiě)完上面的,點(diǎn)擊運(yùn)行后巡语,長(zhǎng)按Lebel并不會(huì)像UITextfield一樣彈出拷貝字樣男公,相反他什么動(dòng)作也沒(méi)有!S抵执隧!
- 3、 重寫(xiě)父類方法蕊唐,使UILabel成為響應(yīng)者
#pragma mark - 重寫(xiě)UIResponder
//讓label能夠成為響應(yīng)事件
- (BOOL)canBecomeFirstResponder{
return YES;
}
**需要說(shuō)明的是:**
在當(dāng)上第一響應(yīng)對(duì)象時(shí)钓试,不同對(duì)象可能會(huì)有一些特殊的表現(xiàn)弓熏。例如UITextField當(dāng)上的時(shí)
候,就會(huì)調(diào)出一塊小鍵盤(pán)材义。
- 4其掂、 控制哪些事件可以響應(yīng)
//控制響應(yīng)的事件
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
return action == @selector(customCopy:);
}