iOS開發之UIMenuController

一、簡介框架

  用於剪切、複製、粘貼、選擇、選擇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
MenuLabel.m文件

  ps:自定義UIMenuItem過可能是自動分頁;code

    部分選擇文本能夠繼承TextView自定義類;orm

    注意事項:自身可交互、成爲第一響應者、顯示前設置好位置等屬性;blog

    self.userInteractionEnabled = YES;
    [self becomeFirstResponder];

    實現UIResponder類中的一個方法:繼承

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender;
相關文章
相關標籤/搜索