![](/img/trans.png)
[英]Is it Possible to add a custom Navigation Bar for CNContactViewController?
[英]CNContactViewController hiding navigation bar
当我将CNContactViewController
推CNContactViewController
UINavigationController
内的UITableViewController
子类的堆栈时,顶部导航栏几乎完全隐藏。 但是随着亮度一直向上,你会看到后面的箭头,然后是“细节”和系统状态栏。 当我点击屏幕的那个角落时,CNContactViewController确实被解雇了。
当然这不好,因为用户可能甚至看不到导航栏的文本,现在按任何按钮来解除。
有没有办法让CNContactViewController的导航栏色调与显示它的视图控制器(我的应用程序的其余部分)相同?
CNContactViewController *controller = [CNContactViewController viewControllerForUnknownContact:person];
controller.contactStore = [[CNContactStore alloc] init];
controller.delegate = self;
controller.allowsActions = NO;
[self.navigationController pushViewController:controller animated:YES];
我应该注意到我只是在iOS 10上遇到这个问题,而不是10以下的版本。当我点击“添加到现有联系人”时,我也得到了正确着色的导航栏,但是当该视图控制器被解除时它再次中断。
所以再一次,我的问题是: 有没有办法让CNContactViewController的导航栏色调与显示它的视图控制器(我的应用程序的其余部分)相同?
您的第二个屏幕截图显示了此问题的原因:您已将条形(或一般条形按钮项目)的色调颜色设置为白色。 因此,它们在透明导航条前面是白色的,在接触视图控制器中是白色背景。
您无法直接对条形色调进行任何操作,但您可以通过以下两种方式之一解决此问题:
一个是让你的导航栏不透明。 在这种情况下,联系人视图控制器的导航栏将为黑色,并且您的白色条按钮项将可见。
另一种方法是在联系人视图控制器按下时更改导航栏的色调颜色(不是条纹色调,而是它向下传递到其按钮项目的色调颜色),并在弹出时更改它。
编辑好的,我看到还有一个问题,因为New Contact视图控制器是在你面前呈现的另一个视图控制器。 如果您拒绝放弃白条按钮项目设置,则在推动联系人视图控制器时,必须使用外观代理将UIBarButtonItem色调设置为其他颜色,然后在导航控制器时将其重置为白色delegate告诉您用户正在弹回您的视图控制器。
我花了几个小时与CNContactViewController进行摔跤,试图强制它适合我的UINavigation外观设置,但它不会。 它有自己的外观和感觉。 我看了一下iOS应用程序,比如Mail和Notes,看看它们是如何显示CNContactViewController的,它似乎显示为一个popover,所以我也是这样。
即使这不是微不足道的。 CNContactViewController必须包装在UINavigationView中,以便Create New Contact和其他视图可以推送。 如果您已覆盖UINavigationBar外观默认值,则需要在之前和之后将它们设置回标准。 以下是它最终的表现:
@property (strong, nonatomic) CNContactViewController *contactViewController;
@property (assign, nonatomic) UIBarStyle saveAppearanceBarStyle;
@property (strong, nonatomic) UIColor *saveAppearanceBarTintColor;
@property (strong, nonatomic) UIColor *saveAppearanceTintColor;
@property (strong, nonatomic) UIColor *saveAppearanceBackgroundColor;
@property (strong, nonatomic) NSDictionary<NSAttributedStringKey, id> * saveAppearanceTitleTextAttributes;
@property (assign, nonatomic) BOOL saveAppearanceTranslucent;
- (IBAction)onAddToContactsButtonTapped:(id)sender
self.contactViewController = [CNContactViewController viewControllerForUnknownContact: ... ]; // as before
[self suspendNavBarAppearanceSettings];
UINavigationController *popNav = [[UINavigationController alloc] initWithRootViewController:self.contactViewController];
popNav.modalPresentationStyle = UIModalPresentationPopover;
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(onAddToContactsDoneTapped:)];
self.contactViewController.navigationItem.leftBarButtonItem = doneButton;
[self presentViewController:popNav animated:YES completion:nil];
UIPopoverPresentationController *popoverController = newNav.popoverPresentationController;
popoverController.permittedArrowDirections = UIPopoverArrowDirectionAny;
popoverController.sourceRect = ...; // where you want it to point
popoverController.sourceView = ...; // where you want it to point
popoverController.delegate = self;
}
- (void) suspendNavBarAppearanceSettings
{
self.saveAppearanceBarStyle = [UINavigationBar appearance].barStyle;
self.saveAppearanceBarTintColor = [UINavigationBar appearance].barTintColor;
self.saveAppearanceTintColor = [UINavigationBar appearance].tintColor;
self.saveAppearanceBackgroundColor = [UINavigationBar appearance].backgroundColor;
self.saveAppearanceTitleTextAttributes = [UINavigationBar appearance].titleTextAttributes;
self.saveAppearanceTranslucent = [UINavigationBar appearance].translucent;
[UINavigationBar appearance].barStyle = UIBarStyleDefault;
[UINavigationBar appearance].barTintColor = nil;
[UINavigationBar appearance].tintColor = nil;
[UINavigationBar appearance].backgroundColor = nil;
[UINavigationBar appearance].titleTextAttributes = nil;
[UINavigationBar appearance].translucent = YES;
}
- (void) restoreNavBarAppearanceSettings
{
[UINavigationBar appearance].barStyle = self.saveAppearanceBarStyle;
[UINavigationBar appearance].barTintColor = self.saveAppearanceBarTintColor;
[UINavigationBar appearance].tintColor = self.saveAppearanceTintColor;
[UINavigationBar appearance].backgroundColor = self.saveAppearanceBackgroundColor;
[UINavigationBar appearance].titleTextAttributes = self.saveAppearanceTitleTextAttributes;
[UINavigationBar appearance].translucent = self.saveAppearanceTranslucent;
}
- (void)onAddToContactsDoneTapped:(id)sender
{
[self restoreNavBarAppearanceSettings];
[[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - CNContactViewControllerDelegate
- (void)contactViewController:(CNContactViewController *)viewController
didCompleteWithContact:(nullable CNContact *)contact
{
[self restoreNavBarAppearanceSettings];
[[self presentedViewController] dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - UIPopoverPresentationControllerDelegate
- (void)prepareForPopoverPresentation:(UIPopoverPresentationController *)popoverPresentationController
{
// This method is only called if we are presented in a popover, i.e. on iPad
// as opposed to full screen like on a phone.
// on iPad you just tap outside to finish, so remove the Done button
self.contactViewController.navigationItem.leftBarButtonItem = nil;
}
- (void)popoverPresentationControllerDidDismissPopover:(UIPopoverPresentationController *)popoverPresentationController
{
[self restoreNavBarAppearanceSettings];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.