CNContactViewController iphone XR 的两个小bug

iOS9以后用苹果给我们提供了ContactsUI方便我们添加联系人到通讯录但是在iphone XR中发现了两个bug

  • bug1: navigationBar的背景是透明的,头像和文字会重合
  • bug2: 点击取消按钮,页面不消失

附上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内点击还会存在原来的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值