4

奇怪的问题:将我的应用程序旋转为纵向后,选择工具栏项并暴露 uipopovercontroller,如果我旋转回横向,右侧的 UINavigationController(SplitView 的 objectAtIndex:0)会更改导航栏的颜色。我不确定为什么。我在 Interface Builder 中将其设置为 barStyle = UIBarStyleBlackOpaque;

返回横向模式后变为银色。

仅当我将其旋转为纵向、创建弹出框并在导航控制器中选择某些内容时才会发生这种情况,这会推送另一个 tableViewController。即使在 viewDidLoad 方法中设置属性也无济于事。

有人有想法吗?

4

9 回答 9

7

viewDidLoad 只会在您的视图第一次显示时被调用(或者如果由于内存问题而被清除)。尝试在 viewWillAppear 中重新设置 barStyle,甚至 - splitViewController:willShowViewController:invalidatingBarButtonItem:。

于 2010-04-15T00:00:26.520 回答
2

对于史蒂夫(检测 RootViewControll 的 PoPView 或 splitView 导航栏)[splitview IPAD]

Yuo 必须在这些方法中从 detailviewcontroller 调用的 RootViewController 上创建一个类方法 (setLand:int i):

- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem {
    // LANDSCAPE !!!!
    [RootViewController setLand:1];

- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc {
    // PORTRAIT!!
    [RootViewController setLand:0];

在 RootViewController 上:

    static int landscape=2;

    ...

// SetMethod for class variable landscape   
        + (void)setLand:(int)i 
        {
            if(landscape!=i){
                landscape = i;

            }
        }

最后总是在 RootViewController

 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     if(landscape == 1)
     {
       //LANDSCAPE!
       CUSTOM FOR LANDSCAPE
       self.navigationController.navigationBar.barStyle =...
     }
     else if(landscape == 0)
     {
       //PORTRAIT!
       CUSTOM FOR PORTRAIT
       self.navigationController.navigationBar.barStyle =...
     }
   }

..这在我的应用程序中运行良好,编辑自定义横向/纵向导航栏

于 2010-11-29T00:18:08.173 回答
2

4.2 和旋转后设置导航栏的 tintColor 似乎存在问题。您可以使用上面的答案正确设置 barStyle,但不能使用 tintColor。还有其他人有同样的问题吗?

于 2010-11-29T19:33:14.860 回答
2

@Brendan G. Lim 和任何其他在 tintColor 上遇到问题的人,终于让它与自定义导航栏一起工作:

  1. 创建从 UINavigationBar 子类化的自定义导航文件
@interface CustomNavigationBar : UINavigationBar 
{
}

@end
  1. 在您的实现文件中,覆盖 setTintColor 方法
@implementation CustomNavigationBar

-(void)setTintColor:(UIColor *)tintColor
{
  [super setTintColor :[self tintColor]];
}

@end
  1. 打开 MainWindow.xib,然后选择要设置颜色的导航栏。在您的身份窗格 [Apple][4] 中,选择 CustomNavigationBar 作为类。

  2. 在属性窗格 [Apple][1] 中设置栏的颜色。

就是这样!

于 2010-12-08T17:58:29.677 回答
1

酷,修好了。

添加到我的 RootViewController 中,其中声明了 splitviewcontroller 和导航栏:

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:YES];


    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

}
于 2010-06-28T00:44:19.393 回答
1

我遇到了同样的问题,但在 viewWillAppear 中重置 barStyle 会导致另一个问题。将它设置在那里也会在它显示在弹出框时设置它,因此它不再与弹出框颜色匹配。仅当它显示在拆分视图控制器的左窗格中时,如何将 barStyle 设置为我想要的?我想我可以将其设置为仅当方向为横向但看起来很脏时才会出现。此外,在 splitViewController:willShowViewController:invalidatingBarButtonItem: 中设置它根本不起作用,因为我认为这是在拆分视图控制器将样式设置回默认值之前调用的。这似乎是苹果的一个非常愚蠢的错误。它应该将其改回原来的样式,而不是默认样式。

于 2010-11-05T15:40:35.903 回答
1

使用以下代码修复此问题

@implementation ChangeNavigationBarColor

- (void) setTintColor:(UIColor*)color
{
    [super setTintColor:[[BrandingManager sharedBrandingManager] tintColorForNavigationController]];
}


@interface ChangeNavigationBarColor : UINavigationBar {

}

@end
于 2010-12-07T10:49:46.060 回答
1

几周前提交了一份错误报告,Apple 表示这是 4.2 的一个已知错误。然后我问是否有办法解决这个问题,但到目前为止没有回复。

用子类/自定义导航栏替换 UINavigationbar 也是没有用的。弹出窗口似乎在 UINavigatioBar 上执行了一些秘密的讨厌的东西,这会杀死 tintColor 并且不允许重置它(即使在重置后它也将始终保持“nil”)。

我基本上放弃了,并告诉客户他将不得不忍受它,直到下一次更新结束(希望如此)。

于 2011-01-04T12:37:14.400 回答
0

您可以使用单独的类来更改颜色,使该类的背景颜色为您想要的颜色,然后将该类用作您的 rootViewController 的类。我做到了,它有效。

于 2011-09-14T10:07:59.320 回答