iPad SplitView改变了主导航栏的颜色

时间:2010-04-14 23:55:37

标签: iphone ipad uinavigationbar uisplitviewcontroller

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

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

只有当我将其旋转为纵向,创建弹出框并在导航控制器中选择一些内容时才会发生这种情况,这会推动另一个tableViewController。即使在viewDidLoad方法中设置属性也不会做任何事情。

有人有想法吗?

9 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

  

for Steve(检测RootViewControll的PoPView或splitView navigationBar)[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 =...
     }
   }

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

@Brendan G. Lim和其他任何使用tintColor时遇到问题的人,最后还是使用了自定义导航栏:

  1. 创建从UINavigationBar
  2. 子类化的自定义导航文件
    @interface CustomNavigationBar : UINavigationBar 
    {
    }
    
    @end
    
    1. 在您的实现文件中,覆盖setTintColor方法
    2. @implementation CustomNavigationBar
      
      -(void)setTintColor:(UIColor *)tintColor
      {
        [super setTintColor :[self tintColor]];
      }
      
      @end
      
      1. 打开MainWindow.xib,然后选择要设置颜色的导航栏。在您的身份窗格[Apple] [4]中选择CustomNavigationBar作为类。

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

      3. 就是这样!

答案 4 :(得分:1)

很酷,修好了。

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

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:YES];


    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

}

答案 5 :(得分:1)

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

答案 6 :(得分:1)

此问题已修复 使用以下代码

@implementation ChangeNavigationBarColor

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


@interface ChangeNavigationBarColor : UINavigationBar {

}

@end

答案 7 :(得分:1)

提起了一个关于几个星期前的错误报告,Apple说这是一个已知的4.2的错误。然后我问是否有办法解决这个问题,但到目前为止还没有回复。

将UINavigationbar替换为子类/自定义导航栏也没用。 popover似乎在UINavigatioBar上执行一些秘密讨厌的东西,这会杀死tintColor并且不允许重置它(即使在重置之后它也总是保持'nil'。)

我基本上放弃并告诉客户他必须忍受它,直到下一次更新(希望)。

答案 8 :(得分:0)

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