一、簡介框架
用於剪切、複製、粘貼、選擇、選擇ALL和DELETE命令的菜單界面。ide
UITextField、UIWebView、UITextView自帶有這種UIMenuController效果; 動畫
二、相關APIatom
#import <Foundation/Foundation.h> #import <CoreGraphics/CoreGraphics.h> #import <UIKit/UIKitDefines.h> NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, UIMenuControllerArrowDirection) { UIMenuControllerArrowDefault, // up or down based on screen location UIMenuControllerArrowUp NS_ENUM_AVAILABLE_IOS(3_2), UIMenuControllerArrowDown NS_ENUM_AVAILABLE_IOS(3_2), UIMenuControllerArrowLeft NS_ENUM_AVAILABLE_IOS(3_2), UIMenuControllerArrowRight NS_ENUM_AVAILABLE_IOS(3_2), } __TVOS_PROHIBITED; @class UIView, UIMenuItem; NS_CLASS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED @interface UIMenuController : NSObject //初始化懶加載 #if UIKIT_DEFINE_AS_PROPERTIES @property(class, nonatomic, readonly) UIMenuController *sharedMenuController; #else + (UIMenuController *)sharedMenuController; #endif //菜單的顯示和隱藏 @property(nonatomic,getter=isMenuVisible) BOOL menuVisible; // default is NO - (void)setMenuVisible:(BOOL)menuVisible animated:(BOOL)animated; //可動畫 //設置顯示區域 - (void)setTargetRect:(CGRect)targetRect inView:(UIView *)targetView; //編輯菜單箭頭指向的方向。 @property(nonatomic) UIMenuControllerArrowDirection arrowDirection NS_AVAILABLE_IOS(3_2); // default is UIMenuControllerArrowDefault @property(nullable, nonatomic,copy) NSArray<UIMenuItem *> *menuItems NS_AVAILABLE_IOS(3_2); // default is nil. 編輯菜單中的自定義菜單項。 //刷新Menu - (void)update; //返回編輯菜單的框架 @property(nonatomic,readonly) CGRect menuFrame; @end UIKIT_EXTERN NSNotificationName const UIMenuControllerWillShowMenuNotification __TVOS_PROHIBITED; //將要顯示 UIKIT_EXTERN NSNotificationName const UIMenuControllerDidShowMenuNotification __TVOS_PROHIBITED; //已經顯示 UIKIT_EXTERN NSNotificationName const UIMenuControllerWillHideMenuNotification __TVOS_PROHIBITED; //將要隱藏 UIKIT_EXTERN NSNotificationName const UIMenuControllerDidHideMenuNotification __TVOS_PROHIBITED; //已經隱藏 UIKIT_EXTERN NSNotificationName const UIMenuControllerMenuFrameDidChangeNotification __TVOS_PROHIBITED; //視圖更新 //自定義菜單項 NS_CLASS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED @interface UIMenuItem : NSObject //標題 和 響應方法 - (instancetype)initWithTitle:(NSString *)title action:(SEL)action NS_DESIGNATED_INITIALIZER; @property(nonatomic,copy) NSString *title; @property(nonatomic) SEL action; @end
三、自定義MenuLabelspa
#import "MenuLabel.h" @implementation MenuLabel - (instancetype)initWithFrame:(CGRect)frame{ if (self = [super initWithFrame:frame]) { [self setUI]; } return self; } - (void)awakeFromNib{ [super awakeFromNib]; [self setUI]; } - (void)setUI{ self.userInteractionEnabled = YES; // self.text = @""; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes:)]]; } - (void)tapGes:(UITapGestureRecognizer *)ges{ [self becomeFirstResponder]; UIMenuController *menu = [UIMenuController sharedMenuController]; menu.menuItems = @[[[UIMenuItem alloc] initWithTitle:@"點贊" action:@selector(tap:)], [[UIMenuItem alloc] initWithTitle:@"留言" action:@selector(reply:)], [[UIMenuItem alloc] initWithTitle:@"踩一踩" action:@selector(down:)], [[UIMenuItem alloc] initWithTitle:@"踩一踩" action:@selector(down:)]]; [menu setTargetRect:self.bounds inView:self]; [menu setMenuVisible:YES animated:YES]; } - (BOOL)canBecomeFirstResponder{ return YES; } - (BOOL)canPerformAction:(SEL)action withSender:(id)sender{ if ( (action == @selector(copy:) && self.text) // 須要有文字才能支持複製 || (action == @selector(cut:) && self.text) // 須要有文字才能支持剪切 || action == @selector(paste:) || action == @selector(tap:) || action == @selector(reply:) || action == @selector(down:)) return YES; return NO; } - (void)cut:(UIMenuController *)menu { //UIPasteboard 粘貼板 // 將label的文字存儲到粘貼板 [UIPasteboard generalPasteboard].string = self.text; // 清空文字 self.text = nil; NSLog(@"cut"); } - (void)copy:(UIMenuController *)menu { // 將label的文字存儲到粘貼板 [UIPasteboard generalPasteboard].string = self.text; NSLog(@"copy"); } - (void)paste:(UIMenuController *)menu { // 將粘貼板的文字賦值給label self.text = [UIPasteboard generalPasteboard].string; NSLog(@"paste"); } - (void)tap:(UIMenuController *)menu{ NSLog(@"tap"); } - (void)reply:(UIMenuController *)menu{ NSLog(@"reply"); } - (void)down:(UIMenuController *)menu{ NSLog(@"down"); } @end
ps:自定義UIMenuItem過可能是自動分頁;code
部分選擇文本能夠繼承TextView自定義類;orm
注意事項:自身可交互、成爲第一響應者、顯示前設置好位置等屬性;blog
self.userInteractionEnabled = YES;
[self becomeFirstResponder];
實現UIResponder類中的一個方法:繼承
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;