iOS 键盘和UIMenuController的并存问题

问题描述

当UITextView 处于编辑状态时,即键盘存在时,UITextView是第一响应者,而当需要弹出UIMenuController时,第一响应者需要变更为处理UIMenuController菜单事件的对象,此时UITextView就不是第一响应者,键盘就会隐藏,造成键盘和UIMenuController不能同时出现。问题示意图如下:

键盘和UIMenuController不能同时出现效果预览

解决方案

史上最详细的iOS之事件的传递和响应机制-原理篇
iOS响应链全家桶

此方案是通过改变响应链来解决的,如果对响应链不了解的先去补一下这方面的知识。

在保证UITextView第一响应者的前提下,我们可以覆盖改变UITextView的nextResponder,让nextResponder指向UIMenuController菜单事件的执行者;同时也要注意,在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 菜单可以执行操作
- (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;
        //添加菜单隐藏的监听,当菜单隐藏时,要重置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
※ 简书://www.greatytc.com/u/e15d1f644bea

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 每天都能遇见美好,每天都能发现未知,每天都为自己取得的点滴进步而乐在其中。遇见美好的事物还真就有了贪婪和想念,欲多...
    落日余晖1阅读 92评论 0 4
  • 在朋友圈逛着,偶然的机会让我接触了简书。发现这里面可以记录我生活的点点滴滴
    原来我也很优秀阅读 392评论 1 1
  • 这次元元的问题是和我的关系会怎样发展? 这次用的是过去现在和未来牌阵。 整个牌阵弥漫着一种悲伤,沉思的氛围。 代表...
    牟星宇浪哩个浪阅读 193评论 0 0
  • 我一直觉得自己属于标准的射手,乐观,爱自由,经常不切实际的幻想,三分钟热度的迷恋偶像。身边也有一个射手座好友,对比...
    一棵跳脱的树阅读 205评论 0 0
  • 阴差阳错的机会,由于同事的离开,她自己的渠道全部对接给我,利润五五分。这就像白捡的业务一样,这几天跟着同事不是开车...
    丁小颖阅读 231评论 3 3