前言:最近一段時間都在做項目,寫博客很少,這幾天會把項目中遇到的一些小知識點總結分享給大家.
先看一下圖,蘋果自帶的UIMenuController都在什么地方
- UITextFiled
UITextFiled.png
- UITextView
UITextView.png
- UIWebView
UIWebView.png
- 由以上3張圖可以看出UITextFiled,UITextView,UIWebView,在這幾個控件上點擊時都能夠彈出UIMenuController,以便我們實現拷貝,粘貼等功能, 但我們在實際開發過程中有可能有這樣的需求,如下圖
cell.png
大家都知道, cell不具備以上功能的,需要我們自己實現這種需求,下面為了方便演示,我對前三張圖片中的UILable實現上述功能.
要讓UILable實現上述功能我們需要對UILable進行重寫,代碼如下;
#import "ZHLable.h"
@implementation ZHLable
- (void)awakeFromNib
{
// 給lable添加手勢
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
}
/**
* label可以成為第一響應者
*/
- (BOOL)canBecomeFirstResponder
{
return YES;
}
/**
* 監聽label點擊
*/
- (void)labelClick
{
// 成為第一響應者
[self becomeFirstResponder];
// 彈出MenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// 設置顯示的范圍
// [menu setTargetRect:self.bounds inView:self];
[menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
}
/**
* 這個方法決定了MenuController的菜單項內容
* 返回YES,就代表MenuController會有action菜單項
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(cut:)
|| action == @selector(copy:)
|| action == @selector(paste:)) return YES;
return NO;
}
#pragma mark - 菜單點擊處理
- (void)cut:(UIMenuController *)menu
{
// 將當前label的文字設置到粘貼板
[UIPasteboard generalPasteboard].string = self.text;
// 清空文字
self.text = nil;
}
- (void)copy:(UIMenuController *)menu
{
// 將當前label的文字設置到粘貼板
[UIPasteboard generalPasteboard].string = self.text;
}
- (void)paste:(UIMenuController *)menu
{
// 將粘貼板的文字設置到當前label上
self.text = [UIPasteboard generalPasteboard].string;
}
@end
- OK,這樣我們實現了上述功能, 如下圖:
lable.png
上述實現過程也不是很難,關鍵是大家需要知道有這個功能,當項目有這樣的需求知道怎么做就行
注: 上面整個示例過程可能對于初學者可能還存在以下問題
- (一)語言問題:
語言問題.png
解決方法:
語言解決.png
- (二)UILable默認不能與用戶交互
@property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteractionEnabled; // default is NO
解決方法:
1??
lable.userInteractionEnabled = YES;
2??
交互.png