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];