UIMenuController的應用
UIMenuController的展示須要基於一個View視圖,其交互則須要基於其地點View視圖的Responder。舉例來講,假如一個UIMenuController展示在以後ViewController的View上,則此UIMenuController的交互邏輯交由以後的ViewController停止治理。
在界面展現出UIMenuController須要3個前提:
1.以後的Responder處於第一呼應。
2.UIMenuController對象挪用menuVisible辦法。
3.以後的Responder完成了以下兩個辦法:
//能否可以成為第一響應 -(BOOL)canBecomeFirstResponder{ return YES; } //能否可以吸收某些菜單的某些交互操作 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{ return YES; }
完成了下面的兩個辦法,應用以下的代碼可以喚出UIMenuController控件:
[self becomeFirstResponder]; //設置菜單顯示的地位 frame設置其文職 inView設置其地點的視圖 [[UIMenuController sharedMenuController] setTargetRect:frame inView:self.view]; //將菜單控件設置為可見 [UIMenuController sharedMenuController].menuVisible = YES;
在履行了下面的代碼後,體系第一次挪用canperformAction:withSender:辦法會停止能否顯示菜單欄的檢測,假如前往為NO,則不克不及顯示菜單欄,假如前往為YES,以後體系會屢次挪用canPerformAction:withSender:辦法,用於檢測以後Responder對象能否完成了菜單欄上某個選項的觸發辦法,假如完成了,菜單欄下面的響應按鈕會顯示,不然不會顯示。開辟者可以在這個辦法中經由過程斷定action來肯定菜單控件中顯示的按鈕品種。體系默許為開辟者供給了一系列的菜單按鈕,例如要顯示剪切和賦值操作的菜單按鈕,示例代碼以下:
-(BOOL)canPerformAction:(SEL)action withSender:(id)sender{ if (action == @selector(cut:)||action == @selector(copy:)) { return YES; } return NO; }
後果以下圖所示:
體系默許支撐供給的按鈕觸發辦法羅列以下:
//剪切按鈕的辦法 - (void)cut:(nullable id)sender NS_AVAILABLE_IOS(3_0); //復制按鈕的辦法 - (void)copy:(nullable id)sender NS_AVAILABLE_IOS(3_0); //粘貼按鈕的辦法 - (void)paste:(nullable id)sender NS_AVAILABLE_IOS(3_0); //選擇按鈕的辦法 - (void)select:(nullable id)sender NS_AVAILABLE_IOS(3_0); //全選按鈕的辦法 - (void)selectAll:(nullable id)sender NS_AVAILABLE_IOS(3_0); //刪除按鈕的辦法 - (void)delete:(nullable id)sender NS_AVAILABLE_IOS(3_2); //轉變書寫形式為從左向右按鈕觸發的辦法 - (void)makeTextWritingDirectionLeftToRight:(nullable id)sender NS_AVAILABLE_IOS(5_0); //轉變書寫形式為從右向左按鈕觸發的辦法 - (void)makeTextWritingDirectionRightToLeft:(nullable id)sender NS_AVAILABLE_IOS(5_0);
下面所羅列的辦法聲明在UIResponder頭文件中,現實上,除下面的辦法,關於UIMenuController下面的按鈕,體系中還有很多公有辦法,羅列以下:
//調換按鈕 - (void)_promptForWordStr:(id)arg1{ NSLog(@"promptForWordStr"); } //簡體繁體轉換按鈕 -(void)_transliterateChinese:(id)sender{ NSLog(@"transliterateChinese"); } //文字作風按鈕 -(void)_showTextStyleOptions:(id)sender{ NSLog(@"showTextStyleOptions"); } //界說按鈕 -(void)_define:(id)sender{ NSLog(@"define"); } -(void)_addShortcut:(id)sender{ NSLog(@"addShortcut"); } -(void)_AccessibilitySpeak:(id)sender{ NSLog(@"AccessibilitySpeak"); } //說話選擇按鈕 -(void)_AccessibilitySpeakLanguageSelection:(id)sender{ NSLog(@"accessibilitySpeakLanguageSelection"); } //暫停發音按鈕 -(void)_accessibilityPauseSpeaking:(id)sender{ NSLog(@"accessibilityPauseSpeaking"); } //分享按鈕 -(void)_share:(id)sender{ NSLog(@"share"); }
實例進階
在現實開辟中,開辟這完整不須要應用這些公有的辦法,UIMenuItem類供給給開辟者停止自界說菜單按鈕與觸發辦法,示例以下:
[self becomeFirstResponder]; UIMenuItem * item = [[UIMenuItem alloc]initWithTitle:@"自界說" action:@selector(newFunc)]; [[UIMenuController sharedMenuController] setTargetRect:[sender frame] inView:self.view]; [UIMenuController sharedMenuController].menuItems = @[item]; [UIMenuController sharedMenuController].menuVisible = YES; -(BOOL)canBecomeFirstResponder{ return YES; } -(BOOL)canPerformAction:(SEL)action withSender:(id)sender{ if (action == @selector(newFunc)) { return YES; } return NO; } -(void)newFunc{ NSLog(@"自界說辦法"); }
後果以下圖所示:
UIMenuController還有以下的屬性用來設置其顯示的地位:
//顯示的地位 @property(nonatomic) UIMenuControllerArrowDirection arrowDirection; //列舉以下: /* 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), }; */
留意點總結
要正常顯示菜單,必需做到以下幾點:
1. -(BOOL)canBecomeFirstResponder 必需前往YES
2. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
該函數中,要顯示的菜單項(包含體系的菜單項)的辦法必需前往YES
3. 在顯示菜單前,必需挪用:
[self becomeFirstResponder]
成為第一個呼應者
4. 為了立時可以正常顯示第二個菜單,必需應用:
[menuController setMenuVisible:NO];
先封閉一下,否則就顯示不出來!
【iOS中長按調出菜單組件UIMenuController的應用實例】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!