UIMenuController糾結(jié)之夜

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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容