我在应用代表的application:didFinishLaunchingWithOptions:
方法中使用此代码在我的应用中使用自定义导航栏外观:
[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navBar.png"] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundColor:[UIColor clearColor]];
但是,当我提出ABPeoplePickerNavigationController
(允许选择联系人填充新电子邮件的收件人:字段)时,此外观会中断,因为系统使用额外的高UINavigationBar
时由于系统设置了prompt
上的UINavigationItem
属性(“选择要发送邮件的联系人”),因此显示视图。
修复是添加此代码:
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearanceWhenContainedIn:[ABPeoplePickerNavigationController class], nil] setBarStyle:UIBarStyleBlack];
看起来像这样:
但是,当您从初始视图中点按群组按钮时,此小修补程序无效。由于超高的导航栏,它仍然看起来很破碎:
任何想法控制器名称对于该视图是什么(所以我可以应用与上面相同的排除),或其他方法来解决这个问题?
答案 0 :(得分:0)
我现在正打这个......运气好吗?我正在考虑尝试通过ABPeoplepickerNavigationControllers视图控制器进行交互并应用appearanceWhenContainedIn方法......
答案 1 :(得分:0)
我也一直在与此作斗争,但我想我已拼凑出一个解决方案。
组选择视图是其他一些(我不太可能是私有的)类,因此我们无法通过外观代理时包含方法指定异常样式,就像您为ABPeoplePickerNavigationController所做的那样。相反,我们应该尝试解决原始问题,即当显示提示并且导航栏很高时,自定义背景图像无法正确呈现。
此处的解决方案(iOS5 UINavigationBar background image issues when prompt is shown)建议使用可调整大小的背景图像作为导航栏。
这几乎对我有用,但我使用的背景图像包含导航栏下方的阴影,并且在显示提示时没有正确调整大小。相反,我不得不使用没有阴影的可调整大小的背景图像,然后单独指定阴影图像。
UINavigationBar* navigationBar = [UINavigationBar appearance];
[navigationBar setBackgroundImage:[[UIImage imageNamed:@"TopBarBackgroundNoShadow"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 0, 3, 0)]
forBarMetrics:UIBarMetricsDefault];
[navigationBar setShadowImage:[UIImage imageNamed:@"TopBarShadowResize"]];
使用这种方法消除了对任何异常样式的需要,并且在ABPeoplePickerNavigationController和组选择视图以及标准高度都看起来很好。