RedRain的簡(jiǎn)書(shū):http://www.itdecent.cn/users/29e03e6ff407/latest_articles
在使用微信等應(yīng)用的時(shí)候,你長(zhǎng)按一個(gè)cell會(huì)出現(xiàn)復(fù)制blalala等一長(zhǎng)串的小黑按鈕,那個(gè)這個(gè)東西就是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
一個(gè)是{{0,0}{0,0}}. 沒(méi)有尺寸呢!!!!!
一個(gè)是NO,怎么不顯示呢!!~
好吧, 搜一下是怎么回事~
原來(lái)要讓MenuController出來(lái)需要同時(shí)控制3個(gè)條件
- 1.becomFirstResponder方法,使view或者viewController的self成為第一響應(yīng)者,可以在相應(yīng)文件的任意地方調(diào)用實(shí)現(xiàn)該方法,不過(guò)建議與UIMenuController放在一起。
[self becomeFirstResponder];
- 2.設(shè)置-(BOOL) canBecomeFirstResponder的返回值為YES,原因不言而喻。
- (BOOL) canBecomeFirstResponder{
return YES;
}
- 3.重載函數(shù)-(BOOL) canPerfomAction:(SEL)actionwithSender:(id)sender,設(shè)置要顯示的菜單項(xiàng),返回值為YES。若不進(jìn)行任何限制,則將顯示系統(tǒng)自帶的所有菜單項(xiàng)(很多的,自己可以試一下),在此,只顯示自定義的2項(xiàng),即
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender{
// 這里需要對(duì)每一個(gè)Item對(duì)應(yīng)的Action進(jìn)行判斷.
if (action ==@selector(CollectCellClick) || action ==@selector(DeleteMenuClick)){
return YES;
}
return NO;//隱藏系統(tǒng)默認(rèn)的菜單項(xiàng)
}
大功告成, 撒花!~
另:
上面的方法,[self becomeFirstResponder];時(shí),在ios5/6沒(méi)問(wèn)題,ios7卻crash:didChangeToFirstResponder
經(jīng)過(guò)幾次查找推測(cè),最終解決:
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內(nèi)加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];