最近用自己的 APP 打字的时候经常发现,拖动选字栏的时候,键盘自动回收了,搜了好久都没发现大家有这个问题,首先想到可以滑动的应该都是UIScrollView
的子类,难道是UIScrollView
添加分类或者Method Swizzling
影响到了键盘?
然后我开始逐行查看分类的代码,发现没有地方影响。
隔了一天,我从另一个方向开始查找,能产生拖动回收的应该是scrollView.keyboardDismissMode = .onDrag
, 所以我全局搜了一次,发现有这么一段代码
private func setupAppearance() {
// UIScrollView
let scrollView = UIScrollView.appearance()
scrollView.keyboardDismissMode = .onDrag
scrollView.backgroundColor = .clear
}
突然好像明白了,使用 appearance 设置了键盘中的 scrollView.keyboardDismissMode = .onDrag
,那么现在只要找到键盘所有UIScrollView
的子类并把他们的拖动回收键盘关掉就好了,于是先看了键盘的层级
发现选字的地方是一个collectionView,于是找到了它的父视图,并添加了以下的代码
private func setupAppearance() {
// UIScrollView
let scrollView = UIScrollView.appearance()
scrollView.keyboardDismissMode = .onDrag
scrollView.backgroundColor = .clear
if let type = NSClassFromString("UIKeyboardCandidateBar") as? UIAppearanceContainer.Type {
let keyboardCandidateBar = UIScrollView.appearance(whenContainedInInstancesOf: [type])
keyboardCandidateBar.keyboardDismissMode = .none
}
}
试了以下,没想到成了。
虽然投机取巧的改了这个问题,但问题反思后发现尽量不要用 appearance,除非是项目特别统一的地方,但也可以通过继承来实现控件标准化,而且通过这种方式修改默认值,很难发现,后期也很容易忘记,很难维护。
网友评论