ISSUE-006
虚幻引擎打不了字
常见表现
启用按键映射的情况下,打不了字。
相关源码
虚幻引擎 IOSView.h
@interface FIOSView : UIView <UIKeyInput, UITextInput>
{
//...
}
PlayTools ControlMode.swift
if PlaySettings.shared.noKMOnInput {
NotificationCenter.default.addObserver(forName: UITextField.textDidEndEditingNotification, object: nil, queue: .main) { _ in
ModeAutomaton.onUITextInputEndEdit()
}
NotificationCenter.default.addObserver(forName: UITextField.textDidBeginEditingNotification, object: nil, queue: .main) { _ in
ModeAutomaton.onUITextInputBeginEdit()
}
}
原因分析
目前PlayCover的智能按键映射只会监听UITextField和UITextView的开始输入、停止输入事件。
但虚幻引擎启用Use Integrated Keyboard后,文本输入将不会调用UITextField,而是直接通过UIKeyInput接口实现,也就不会产生UITextField的相关事件广播。
解决方法
临时解决方法:
右键游戏图标 - 设置 - 键盘映射设置,禁用“按键映射布局” 或 禁用“智能按键映射”。
临时修复代码:
PlayTools NSObject+Swizzle.m
手动发送相关事件广播。
- (BOOL)hook_FIOSView_becomeFirstResponder {
BOOL ret = [self hook_FIOSView_becomeFirstResponder];
[[NSNotificationCenter defaultCenter] postNotificationName:UITextFieldTextDidBeginEditingNotification
object:nil];
return ret;
}
- (BOOL)hook_FIOSView_resignFirstResponder {
BOOL ret = [self hook_FIOSView_resignFirstResponder];
[[NSNotificationCenter defaultCenter] postNotificationName:UITextFieldTextDidEndEditingNotification
object:nil];
return ret;
}
[objc_getClass("FIOSView") swizzleInstanceMethod:@selector(becomeFirstResponder) withMethod:@selector(hook_FIOSView_becomeFirstResponder)];
[objc_getClass("FIOSView") swizzleInstanceMethod:@selector(resignFirstResponder) withMethod:@selector(hook_FIOSView_resignFirstResponder)];