iOS9以后用苹果给我们提供了ContactsUI方便我们添加联系人到通讯录但是在iphone XR中发现了两个bug
附上bug图两张
问题一的解决方式:
我们要做一个延时才能获取到navigationBar
,然后去改变它的背景色。
第一个bug的解决方法:
let mutableContact = CNMutableContact()
mutableContact.givenName = "马小撂"
let contactController = CNContactViewController(forNewContact: mutableContact)
let nav = UINavigationController(rootViewController: contactController)
nav.modalPresentationStyle = .overFullScreen
self.present(nav, animated: true, completion: nil)
///延时后 改变背景颜色
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
nav.navigationBar.backgroundColor = UIColor.white
}
问题二的解决方式:
先看一下为什么会出现这种问题:
其实我们在点击取消的时候,系统为我们添加了一个弹出,放弃更改和继续编辑,但是并没有回收键盘,导致键盘遮挡了弹窗,就回不去了。
我们想回收键盘,就要先关闭弹窗。
这个我也没有想到什么好的办法,只能曲线救国,找到取消按钮然后覆盖它,让CNContactViewController
直接dismiss
,不弹出弹窗
附上一段代码:
import ContactsUI
///遵循两个代理方法
CNContactViewControllerDelegate, UIGestureRecognizerDelegate
///找到取消按钮,并覆盖
func addMaskView(nav: UINavigationBar, action: Selector) {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
nav.backgroundColor = UIColor.white
for (_, view) in nav.subviews.enumerated() {
if view.isKind(of: NSClassFromString("_UINavigationBarContentView") ?? UIView.self) == true {
for (_, item) in view.subviews.enumerated() {
if item.isKind(of: NSClassFromString("_UIButtonBarStackView") ?? UIView.self) {
if item.frame.origin.x < UIScreen.main.bounds.size.width/2 {
for (_, button) in item.subviews.enumerated() {
if button.isKind(of: NSClassFromString("_UIButtonBarButton") ?? UIBarButtonItem.self) {
let cancelView = UIView(frame: button.bounds)
cancelView.backgroundColor = UIColor.clear
cancelView.isUserInteractionEnabled = true
button.addSubview(cancelView)
let tap = UITapGestureRecognizer()
tap.addTarget(self, action: action)
tap.delegate = self
cancelView.addGestureRecognizer(tap)
}
}
}
}
}
}
}
}
}
@objc func addTapAction(){
//CNContactViewController消失
}
总结:问题可以解决
缺陷:延时1S后才会覆盖取消按钮,1S内点击还会存在原来的问题