UIMenuController
UIMenuController須知
- 默認情況下, 有以下控件已經支持UIMenuController
- UITextField
- UITextView
- UIWebView
讓其他控件也支持UIMenuController(比如UILabel)
- 自定義UILabel
- 重寫2個方法
/**
* 讓label有資格成為第一響應者
*/
- (BOOL)canBecomeFirstResponder
{
return YES;
}
/**
* label能執行哪些操作(比如copy, paste等等)
* @return YES:支持這種操作
*/
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;
return NO;
}
- 實現各種操作方法
- (void)cut:(UIMenuController *)menu
{
// 將自己的文字復制到粘貼板
[self copy:menu];
// 清空文字
self.text = nil;
}
- (void)copy:(UIMenuController *)menu
{
// 將自己的文字復制到粘貼板
UIPasteboard *board = [UIPasteboard generalPasteboard];
board.string = self.text;
}
- (void)paste:(UIMenuController *)menu
{
// 將粘貼板的文字 復制 到自己身上
UIPasteboard *board = [UIPasteboard generalPasteboard];
self.text = board.string;
}
- 讓label成為第一響應者
// 這里的self是label
[self becomeFirstResponder];
- 顯示UIMenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// targetRect: MenuController需要指向的矩形框
// targetView: targetRect會以targetView的左上角為坐標原點
[menu setTargetRect:self.bounds inView:self];
// [menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
自定義UIMenuController內部的Item
- 添加item
// 添加MenuItem(點擊item, 默認會調用控制器的方法)
UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"頂" action:@selector(ding:)];
UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回復" action:@selector(replay:)];
UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"舉報" action:@selector(report:)];
menu.menuItems = @[ding, replay, report];
注意
自定義UIMenuItem,該item的實現方法必須寫在控制器中,否則自定義item無法顯示
例:
#import "ViewController.h"
#import "ZBLabel.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic) IBOutlet ZBLabel *customLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)ding:(UIMenuController *)menu
{
NSLog(@"%s %@", __func__, menu);
}
- (void)replay:(UIMenuController *)menu
{
NSLog(@"%s %@", __func__, menu);
}
- (void)report:(UIMenuItem *)menu
{
NSLog(@"%s %@", __func__ , menu);
}
為了代碼的整體結構,這樣寫更好
#import "ViewController.h"
#import "XMGLabel.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@property (weak, nonatomic) IBOutlet XMGLabel *label;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.webView loadHTMLString:@"<div style=\"color:red;\">哈哈哈哈</div>" baseURL:nil];
[self.label addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelClick)]];
}
- (void)labelClick
{
// 1.label要成為第一響應者(作用是:告訴UIMenuController支持哪些操作, 這些操作如何處理)
[self.label becomeFirstResponder];
// 2.顯示MenuController
UIMenuController *menu = [UIMenuController sharedMenuController];
// 添加MenuItem
UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"頂" action:@selector(ding:)];
UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回復" action:@selector(replay:)];
UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"舉報" action:@selector(report:)];
menu.menuItems = @[ding, replay, report];
[menu setTargetRect:self.label.bounds inView:self.label];
[menu setMenuVisible:YES animated:YES];
}
- (void)ding:(UIMenuController *)menu
{
NSLog(@"%s %@", __func__ , menu);
}
- (void)replay:(UIMenuController *)menu
{
NSLog(@"%s %@", __func__ , menu);
}
- (void)report:(UIMenuController *)menu
{
NSLog(@"%s %@", __func__ , menu);
}
@end