3

所以我使用apprearance api来设计我所有的观点。菲我风格我的UINavigationBar使用:

[[UINavigationBar appearance] setBackgroundImage:navigationBarBgImage forBarMetrics:UIBarMetricsDefault];

我想利用外观 api 的优势,UINavigationBar在一个地方设计我的所有 s(因为我有多个),所以我不想仅仅因为造型原因而做一些子类化。

我还弹出一些MFMessageComposeViewControllers 和 aSLComposeViewController以发布到 imessage 或 facebook。

我的问题是,如果我尝试在 facebook 上选择相册或在 imessage modalview 上选择联系人,则会发生这种情况:

在此处输入图像描述

查看 imessage 模态视图的递归描述:

$0 = 0x1f1f1320 <UIWindow: 0x1e5c8900; frame = (0 0; 320 568); layer = <UIWindowLayer: 0x1e5c8a00>>
   | <UILayoutContainerView: 0x1e592860; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x1e592910>>
   |    | <UINavigationTransitionView: 0x1f1c88a0; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1f1c8960>>
   |    |    | <UIViewControllerWrapperView: 0x1f1ee090; frame = (0 20; 320 548); autoresize = W+H; layer = <CALayer: 0x1f2f9560>>
   |    |    |    | <UIView: 0x1f2f3d20; frame = (0 0; 320 548); autoresize = W+H; layer = <CALayer: 0x1f2f3d80>>
   |    |    |    |    | <_UISizeTrackingView: 0x1f2effd0; frame = (0 0; 320 548); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1f2f00b0>>
   |    |    |    |    |    | <_UIRemoteView: 0x1f2f01e0; frame = (0 0; 320 568); transform = [0.5, -0, 0, 0.5, -0, 0]; userInteractionEnabled = NO; layer = <CALayerHost: 0x1f2f0330>>

有什么想法最好切换回默认模式吗?

4

3 回答 3

4

您最好的选择实际上是对一件事或另一件事进行子类化。否则,您将在任何地方撤消样式。我将通过以下两种方式之一进行:

一种是对该类UINavigationController所包含的内容进行子类化和样式化UINavigationBar

UINavigationBar *navigationBarProxy = [UINavigationBar appearanceWhenContainedIn:[MyNavigationController class], nil]; // 
[navigationBarProxy setBackgroundImage:navigationBarBackgroundImage forBarMetrics:UIBarMetricsDefault];
// and so on

另一种方法是子类UINavigationBar化,设置该类的外观,并以UINavigationController这种方式实例化你:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:nil];
// navigationController now has a navigationBar of your preferred type
于 2012-11-16T11:18:02.990 回答
2

好吧,可能的解决方案是将导航栏设置为它们的原始色调[UINavigationBar appearanceWhenContainedIn:[SLComposeViewController class]] ...

于 2012-11-05T21:12:19.107 回答
1

我遇到了同样的问题,更糟糕的是,它导致我的应用程序在任何基于 XPC/UIRemoteView 的控制器上崩溃,包括 SLComposeViewController 和 MFMailComposeViewController。

我的解决方案是使用这个:

[[UINavigationBar appearanceWhenContainedIn:[RootViewController class], nil] setBackgroundImage:[UIImage imageNamed:@"navbar.png"] forBarMetrics:UIBarMetricsDefault];

代替:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar.png"] forBarMetrics:UIBarMetricsDefault];

其中 RootViewController 是您命名的 UIViewController,它包含您应用的所有子视图。

它并不适用于所有事情(取决于控制器在层次结构中的结束方式),但是,嘿,它是某种东西。

于 2012-12-10T06:21:40.733 回答