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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容