iOS之关于长按文本内容可能无法弹出UIMenuController的问题说明

问题必现的应用场景:

在iOS 14.2+系统中,开启全局悬浮搜索按钮并点击该按钮时会弹出搜索界面。这时候可以找到可弹出UIMenuController的地方,尝试长按操作。(比如:新闻详情、单词详情等)会发现并未弹出。


为什么iOS 14.2+系统会产生该问题?

之前的系统版本,单击搜索按钮时,是不会主动触发makeKeyWindow方法的;而14.2+系统在每次点击后,都会触发makeKeyWindow(估计有什么特别的需要,原有逻辑被苹果开发者改掉),导致整个APP的keyWindow直接变成悬浮搜索按钮。难怪UIMenuController会一脸懵逼(这时可能已经显示在自定义Window上了,只是因其尺寸过小未能展示出来),无法显示在我们指定的keyWindow(其rootViewController为MainVC)。


解决方案:

1.在自定义的Window(全局悬浮搜索按钮)中重写makeKeyWindow方法,里面啥也不做。(覆盖系统的makeKeyWindow方法的实现,因为全局悬浮搜索按钮不需要设置为makeKeyWindow)。代码如下:

- (void)makeKeyWindow {
//nothing to do.
}


2.采用系统的私有方法,直接设置全局悬浮搜索按钮,使其不可成为keyWindow。代码如下:

- (void)_canBecomeKeyWindow {
return NO;
}


总结:

方法1,已在辞書项目中使用;(目前推荐
方法2,该私有方法很好的解决问题,但可惜的是因苹果方有要求,私有方法仅用于测试,不能提交上架否则会审核被拒。(不推荐)