UIMenuController糾結之夜
RedRain的簡書:http://www.jianshu.com/users/29e03e6ff407/latest_articles
在使用微信等應用的時候,你長按一個cell會出現複製blalala等一長串的小黑按鈕,那個這個東西就是UIMenuController, 上程式碼~~~
-(void)SystemNotifyLongPress:(UILongPressGestureRecognizer *)longPress{
if (longPress.state == UIGestureRecognizerStateBegan) {
UIWindow *window = [[UIApplication sharedApplication].delegate window];
if ([window isKeyWindow] == NO)
{
[window becomeKeyWindow];
[window makeKeyAndVisible];
}
[self becomeFirstResponder];
UIMenuItem *collectID = [[UIMenuItem alloc] initWithTitle:@"收藏" action:@selector(CollectCellClick)];
UIMenuItem *deleteID = [[UIMenuItem alloc] initWithTitle:@"刪除" action:@selector(DeleteMenuClick)];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:@[collectID, deleteID]];
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
}
}
我常按~~~~~~~~~~~~~~ 我ca, 我的按鈕哪裡去了!!!
列印它們Frame,isMenuVisible
一個是{{0,0}{0,0}}. 沒有尺寸呢!!!!!
一個是NO,怎麼不顯示呢!!~
好吧, 搜一下是怎麼回事~
原來要讓MenuController出來需要同時控制3個條件
- 1.becomFirstResponder方法,使view或者viewController的self成為第一響應者,可以在相應檔案的任意地方呼叫實現該方法,不過建議與UIMenuController放在一起。
[self becomeFirstResponder];
- 2.設定-(BOOL) canBecomeFirstResponder的返回值為YES,原因不言而喻。
- (BOOL) canBecomeFirstResponder{
return YES;
}
- 3.過載函式-(BOOL) canPerfomAction:(SEL)actionwithSender:(id)sender,設定要顯示的選單項,返回值為YES。若不進行任何限制,則將顯示系統自帶的所有選單項(很多的,自己可以試一下),在此,只顯示自定義的2項,即
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender{
// 這裡需要對每一個Item對應的Action進行判斷.
if (action ==@selector(CollectCellClick) || action ==@selector(DeleteMenuClick)){
return YES;
}
return NO;//隱藏系統預設的選單項
}
大功告成, 撒花!~
另:
上面的方法,[self becomeFirstResponder];時,在ios5/6沒問題,ios7卻crash:didChangeToFirstResponder
經過幾次查詢推測,最終解決:
1,首先,在UITableVeiw層
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (IOS7)
{
if (scrollView == myTable)
{
NSArray *_cellArray = [myTable visibleCells];
if([_cellArray count] > 0)
{
[_cellArray makeObjectsPerformSelector:@selector(hiddenMenu)];
}
}
}
}
2,在UITableVeiwCell內加hiddenMenu
-(void)hiddenMenu
{
if (IOS7)
{
if ([self canBecomeFirstResponder])
{
if ([self isFirstResponder])
{
[self resignFirstResponder];
}
}
UIMenuController *menu = [UIMenuController sharedMenuController];
if ([menu isMenuVisible]) {
[menu setMenuVisible:NO animated:YES];
}
}
}
3,並在UILongPressGestureRecognizer新增的地方加delegate
_recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
if (IOS7) {
_recognizer.delegate = self;
}
[recognizerView addGestureRecognizer:_recognizer];
[_recognizer release];
相關文章
- 變數命名的糾結變數
- UIMenuController的使用簡介UIController
- 糾結的連等賦值賦值
- Java中的String不再糾結Java
- 每天都在糾結與迷茫中徘徊
- UIPasteboard UIMenuController 刪除崩潰問題UIASTController
- 工作在矛盾糾結中進行著
- 糾結的連結——ln、ln -s、fs.symlink、requireUI
- vue元件命名指南,不為取名而糾結Vue元件
- 關於糾結的recycle pool的設定
- 魔法使之夜 雜談
- 年底跳槽真的很糾結?解決方案在此!
- 出現程式設計疲勞?千萬別糾結程式設計
- AKM專案軼事之糾結 - Bonded warehouse 流程
- 關於join查詢的那麼點糾結
- SLG大戰中的騰訊遊戲:武器很多,糾結不少遊戲
- 愛奇藝的資料庫選型大法,實用不糾結!資料庫
- 少糾結選什麼工具,多生產內容
- 月圓之夜裝系統
- 入行容易還高薪,別再糾結學不學前端了高薪前端
- epic堡壘之夜怎麼設定中文 堡壘之夜設定了中文沒用
- 軟體糾錯
- 糾結了,微服務和單體你選擇哪一個?微服務
- 關於ERP系統,模切企業別糾結了
- epic堡壘之夜怎麼設定中文2022 epic堡壘之夜怎麼調中文
- PS5 遊戲機定價難,索尼在糾結什麼?遊戲
- 糾結應該先學Python還是Java?看完就有數了PythonJava
- 前端小糾結--提高開發效率VSCode外掛推薦前端VSCode
- 很多人比較糾結的約束和索引的關係索引
- 糾結的IE瀏覽器記憶體洩漏的測試瀏覽器記憶體
- 基於機器學習的糾錯系統技術 - 智慧文字糾錯 API機器學習API
- 原始碼篇:Flutter Bloc背後的思想,一篇糾結的文章原始碼FlutterBloC
- 架構分層的小糾結-層級該如何劃分與定位?架構
- 這個TapTap排行第一的遊戲,讓我玩出了愛恨糾結APT遊戲
- 我為什麼勸你不要過度糾結於技術細節?
- AI的“色差”與“糾偏”AI
- 校驗碼&糾錯碼
- 如何選擇糾刪碼編碼引擎 | 糾刪碼技術詳解(上)