iOS 鍵盤和UIMenuController的并存問題

問題描述

當UITextView 處于編輯狀態(tài)時,即鍵盤存在時,UITextView是第一響應者,而當需要彈出UIMenuController時,第一響應者需要變更為處理UIMenuController菜單事件的對象,此時UITextView就不是第一響應者,鍵盤就會隱藏,造成鍵盤和UIMenuController不能同時出現。問題示意圖如下:

鍵盤和UIMenuController不能同時出現效果預覽

解決方案

史上最詳細的iOS之事件的傳遞和響應機制-原理篇
iOS響應鏈全家桶

此方案是通過改變響應鏈來解決的,如果對響應鏈不了解的先去補一下這方面的知識。

在保證UITextView第一響應者的前提下,我們可以覆蓋改變UITextView的nextResponder,讓nextResponder指向UIMenuController菜單事件的執(zhí)行者;同時也要注意,在UIMenuController隱藏后,要取消nextResponder指向,不改變原有的響應鏈。


@interface SLTextView : UITextView
//覆蓋下一個響應者
@property (nonatomic, weak) UIResponder *overrideNextResponder; 
@end
@implementation SLTextView

- (UIResponder *)nextResponder {
    if(_overrideNextResponder == nil){
        return [super nextResponder];
    } else {
        return _overrideNextResponder;
    }
}
// UIMenuController 菜單可以執(zhí)行操作
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if (_overrideNextResponder != nil) {
        return NO;
    }
    return [super canPerformAction:action withSender:sender];
}
@end


//長按顯示菜單 UIMenuController
- (void)longPressShowMenuView:(UILongPressGestureRecognizer *)longPress {
    //編輯過程中,self.textView是第一響應者
    if(self.textView.isFirstResponder){
        //如果textView是第一響應者,則對titleLabel進行響應鏈透傳,覆蓋self.textView的下一個響應者
        self.textView.overrideNextResponder = self.titleLabel;
        //添加菜單隱藏的監(jiān)聽,當菜單隱藏時,要重置self.textView.overrideNextResponder = nil
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuViewDidHide:) name:UIMenuControllerDidHideMenuNotification object:nil];
    }else {
        //如果當前無第一響應者,就成為第一響應者
        [self.titleLabel becomeFirstResponder];
    }
    
    UIMenuController *menuController = [UIMenuController sharedMenuController];
    UIMenuItem *saveItems = [[UIMenuItem alloc] initWithTitle:@"保存" action:@selector(save:)];
    UIMenuItem *noteItem = [[UIMenuItem alloc] initWithTitle:@"筆記" action:@selector(note:)];
    menuController.menuItems = @[noteItem, saveItems];
    if (@available(iOS 13.0, *)) {
        [menuController showMenuFromView:self.view rect:self.titleLabel.frame];
    } else {
        [menuController setTargetRect:self.titleLabel.frame inView:self.view];
        [menuController setMenuVisible:YES animated:YES];
    }
}

// 隱藏菜單UIMenuController的通知
- (void)menuViewDidHide:(NSNotification*)notification {
    //重置,不影響原有的響應鏈
    self.textView.overrideNextResponder = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerDidHideMenuNotification object:nil];
}

鍵盤和UIMenuController并存問題解決

iOS_Tips 不定時更新,已有示例 : 1、暗黑模式 2、AppleID登錄應用 3、AVFoundation 高仿微信相機拍攝和編輯 4、AVFoundation 人臉檢測 5、AVFoundation 實時濾鏡 6、GPUImage框架的使用 7、VideoToolBox和AudioToolBox音視頻編解碼 8、OpenGL ES學習 9、LeetCode算法練習 10、鍵盤和UIMenuController的并存問題。。。。。

如果需要跟我交流的話:
※ Github: https://github.com/wsl2ls
※ 簡書:http://m.itdecent.cn/u/e15d1f644bea

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 每天都能遇見美好,每天都能發(fā)現未知,每天都為自己取得的點滴進步而樂在其中。遇見美好的事物還真就有了貪婪和想念,欲多...
    落日余暉1閱讀 133評論 0 4
  • 在朋友圈逛著,偶然的機會讓我接觸了簡書。發(fā)現這里面可以記錄我生活的點點滴滴
    原來我也很優(yōu)秀閱讀 468評論 1 1
  • 這次元元的問題是和我的關系會怎樣發(fā)展? 這次用的是過去現在和未來牌陣。 整個牌陣彌漫著一種悲傷,沉思的氛圍。 代表...
    牟星宇浪哩個浪閱讀 223評論 0 0
  • 我一直覺得自己屬于標準的射手,樂觀,愛自由,經常不切實際的幻想,三分鐘熱度的迷戀偶像。身邊也有一個射手座好友,對比...
    一棵跳脫的樹閱讀 266評論 0 0
  • 陰差陽錯的機會,由于同事的離開,她自己的渠道全部對接給我,利潤五五分。這就像白撿的業(yè)務一樣,這幾天跟著同事不是開車...
    丁小穎閱讀 337評論 3 3

友情鏈接更多精彩內容