场景是,改变textField弹出键盘的frame
话不多说,直接上代码
// 点击获取当前屏幕上展示的键盘,没有就置空
@IBAction func buttonAction(_ sender: Any) {
keyBoardBackView = getKeyBoard()
}
// 移动获取到的键盘
@IBAction func moveAction(_ sender: Any) {
if keyBoardBackView != nil {
if var bounds = keyBoardBackView?.bounds {
bounds.origin.y -= 20;
keyBoardBackView?.bounds = bounds
}
}
}
/**
目前可以肯定的是,UIKeyBoard展示出来的时候,它的结构再不同的iOS版本上肯定是不同的,
我不知道是哪个版本之后,结构才像我现在这么解析的这种,我是一层层看视图找到的,所以要注意2点:
1. 不同的iOS版本,这个遍历获取keyBoardBackView的 keyPath 问题
2. 横竖屏问题
*/
func getKeyBoard() -> UIView? {
// UIApplication.shared.windows iOS15之后改写法了
let windows = UIApplication.shared.windows
for window in windows.reversed() {
let keyBoardWindow:AnyClass? = NSClassFromString("UIRemoteKeyboardWindow")
if window.isKind(of: keyBoardWindow!) { // 键盘是放在 主window 的同级另一个 window下的
let keyBoard = getKeyBoardInView(window)
return keyBoard
}
}
return nil
}
func getKeyBoardInView(_ view:UIView) -> UIView? {
for subView in view.subviews {
let containerView:AnyClass? = NSClassFromString("UIInputSetContainerView")
let inputSetHostView:AnyClass? = NSClassFromString("UIInputSetHostView")
if subView.isKind(of: containerView!) { // 键盘Window controll的 的 主View
return getKeyBoardInView(subView); // 继续往下一层查
} else if subView.isKind(of: inputSetHostView!) { // 这个View 就是 keyBoard 的 BackView
print("找到了")
subView.backgroundColor = UIColor.red
return subView
}
}
return nil
}
阅读量
loading...