CNContactViewController导航栏版本之间有所不同

时间:2016-09-30 14:05:46

标签: ios ios10 xcode8 uicolor cncontactviewcontroller

我们的色调为白色。我们的应用程序使用CNContactViewController。在我们使用针对iOS 8和9的Xcode 7构建的商店中的应用程序版本中,如果您是iOS 9,我们调用了CNContactViewController。后退按钮为白色,但后面有一个灰色导航栏。在我们使用Xcode 8定位iOS 9和10的开发版本中,没有灰色条,因此后退按钮在白色顶部是白色的,很难看到阴影。

CNContactViewController的导航区域已更改的Xcode版本/ SDK版本之间是否有其他人经历过更改?我们的应用程序中是否会有其他一些会影响此栏的变化?

编辑:这是我们最新版本中的图片。我确实删除了一些个人信息,所以这是中间的方框,但你可以在左上方看到它很难看到后退按钮。

enter image description here

编辑:这是我们在整个应用中设置颜色的方式。如果白色后退按钮也使用红色的条纹色调而不是任何东西

,则不会出现问题
    UINavigationBar.appearance().barTintColor = UIColor.red
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]

我们用于将其推送到具有红色条和白色按钮的现有导航控制器的代码:

let ucvc = CNContactViewController(forUnknownContact: contact)
ucvc.delegate = self
ucvc.allowsEditing = true
ucvc.allowsActions = true
ucvc.alternateName = name()
ucvc.contactStore = CNContactStore()
self.navigationController?.pushViewController(ucvc, animated: true)

6 个答案:

答案 0 :(得分:6)

我遇到了完全相同的问题。它看起来像iOS 10的bug。无论如何,我通过将导航栏的半透明度设置为false来找到解决方法。然后将应用程序主窗口的背景颜色设置为您希望导航栏的颜色。

一些代码段:

UINavigationBar.appearance().isTranslucent = false
UIApplication.shared.delegate?.window??.backgroundColor = UIColor.red

答案 1 :(得分:1)

我已经解决了这个问题:

CNContactViewController *vc = [CNContactViewController viewControllerForContact:contact];
vc.delegate = self;

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    for (UIView *view in [vc.navigationController.navigationBar subviews]) {
        view.tintColor = [UIColor darkTextColor];

        view.backgroundColor = [UIColor redColor];
    }
});

[self.navigationController pushViewController:vc animated:YES];

答案 2 :(得分:1)

通过使用XCode的Debug View Hierarchy,我发现在推送CNContactViewController之后,UINavigationBar的子视图名为“_UIBarBackground”的alpha变为0。

以下代码可帮助我解决问题(在iOS 11中运行良好):

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        for (UIView *view in self.navigationController.navigationBar.subviews) {
            if ([view isKindOfClass:NSClassFromString(@"_UIBarBackground")]) {
                view.alpha = 1;
                break;
            }
        }
    });

答案 3 :(得分:0)

你的问题解决了我的问题:我现在知道为什么我有同样的问题。

我已经通过在推送CNContactViewController之前将navigationController.navigationBar.tintColor设置为蓝色阴影来解决它。退出时(在委托方法中)将其设置为白色。

答案 4 :(得分:0)

在Swift 5和Xcode 10.2中

在iOS 9.0中,CNContactViewController导航栏可以正常运行,但不能运行更高版本。

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(0.1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {

   //Set status bar background colour
   let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
   statusBar?.backgroundColor = UIColor.red
   //Set navigation bar subView background colour
       for view in controller.navigationController?.navigationBar.subviews ?? [] {
          view.tintColor = UIColor.white
          view.backgroundColor = UIColor.red
       }
})

navigationController?.pushViewController(controller, animated: true)

在这里,我固定了状态栏背景色和导航栏背景色。如果您不希望状态栏显示颜色,请对其进行注释。

完整的代码是

func addPhoneNumber(phNo:String) {
    if #available(iOS 9.0, *) {
        let store = CNContactStore()
        let contact = CNMutableContact()
        let homePhone = CNLabeledValue(label: CNLabelHome, value: CNPhoneNumber(stringValue : phNo))
        contact.phoneNumbers = [homePhone]
        let controller = CNContactViewController(forUnknownContact : contact)
        controller.contactStore = store
        controller.delegate = self

        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(0.1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {

            //Set status bar background colour
            let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
            statusBar?.backgroundColor = UIColor.red
            //Set navigation bar subView background colour
            for view in controller.navigationController?.navigationBar.subviews ?? [] {
                view.tintColor = UIColor.white
                view.backgroundColor = UIColor.red
            }
        })

        navigationController?.pushViewController(controller, animated: true)
    }
}

答案 5 :(得分:0)

只需继承 CNContactViewController

    class MyAwesomeViewController: CNContactViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.navigationController?.navigationBar.subviews.forEach({ (aView) in
            aView.backgroundColor = UIColor.red
        })
    }
    
}