代码之家  ›  专栏  ›  技术社区  ›  Daddy

iPad SplitView更改主导航栏颜色

  •  4
  • Daddy  · 技术社区  · 16 年前

    奇怪的问题:在将我的应用程序旋转到Portrait、选择工具栏项并暴露uipopOverController之后,如果我旋转回Landscape,则右侧的uinavigationController(splitView的objectatindex:0)会更改导航栏的颜色。我不知道为什么。我在接口生成器中将其设置为barStyle=uibarStyleBlackOpaque;

    当它返回到景观模式后,会变成银色。

    只有当我将其旋转到Portrait、创建Popover并在导航控制器中选择某个内容时,才会发生这种情况,导航控制器会推送另一个TableView控制器。即使在viewdidload方法中设置属性也不起作用。

    有人有主意吗?

    9 回复  |  直到 16 年前
        1
  •  7
  •   Ben Gottlieb    16 年前

    只有在第一次显示视图时(或者由于内存问题而清除视图时),才会调用viewdidload。尝试重新设置视图中的条形图样式将显示,甚至“SplitViewController:WillshowViewController:InvalidatingBarButtonItem:”。

        2
  •  2
  •   ikanimo    15 年前

    对于Steve(检测rootviewcontrol的popview或splitview导航栏)【splitview ipad】

    yuo必须在rootviewcontroller上创建一个类方法(setland:int i),该类方法是在以下方法中从detailviewcontroller调用的:

    - (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 =...
         }
       }
    

    …这在我的应用程序中很好地工作,编辑自定义横向/纵向导航栏

        3
  •  2
  •   Brendan G. Lim    15 年前

    4.2和在旋转后设置导航栏的淡色似乎有问题。您可以使用上面的答案正确设置条形图样式,但不能使用淡色。其他人也有同样的问题吗?

        4
  •  2
  •   Roddy    15 年前

    @Brendan G.Lim和任何其他对Tintcolor有问题的人,最终让它与自定义导航栏一起工作:

    1. 从uinavigationbar创建自定义导航文件子类
    @interface CustomNavigationBar : UINavigationBar 
    {
    }
    
    @end
    
    1. 在实现文件中,重写setIntColor方法
    @implementation CustomNavigationBar
    
    -(void)setTintColor:(UIColor *)tintColor
    {
      [super setTintColor :[self tintColor]];
    }
    
    @end
    
    1. 打开mainwindow.xib,选择要设置颜色的导航栏。在标识窗格[Apple][4]中,选择CustomNavigationBar作为类。

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

    就是这样!

        5
  •  1
  •   Steve    15 年前

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

        6
  •  1
  •   Max the Racoon    15 年前

    几周前提交了一份bug报告,苹果称这是一个已知的4.2的bug。然后我问是否有办法解决这个问题,但到目前为止没有答复。

    用子类/自定义导航栏替换uinavigationbar也是没有用的。Popover似乎在uinavigatiobar上执行了一些秘密的讨厌的操作,这会杀死tintcolor,并且不允许重置它(即使重置之后,它也始终保持为“nil”)。

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

        7
  •  1
  •   Maulik shraddha hattimare    13 年前

    这个问题解决了 使用以下代码

    @implementation ChangeNavigationBarColor
    
    - (void) setTintColor:(UIColor*)color
    {
        [super setTintColor:[[BrandingManager sharedBrandingManager] tintColorForNavigationController]];
    }
    
    
    @interface ChangeNavigationBarColor : UINavigationBar {
    
    }
    
    @end
    
        8
  •  1
  •   Maulik shraddha hattimare    13 年前

    冷静,修理它。

    添加到我的rootviewcontroller,其中声明了splitviewcontroller和nav栏:

    - (void)viewWillAppear:(BOOL)animated {
    
        [super viewWillAppear:YES];
    
    
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
    
    }
    
        9
  •  0
  •   user944329    14 年前

    您可以使用单独的类来更改颜色,将该类的背景色设置为所需的颜色,然后将该类用作rootviewcontroller的类。是的,它起作用了。

    推荐文章