1

我找到了足够好的例子,说明如何使用自定义图像作为 UINavigationBar 的背景,而不在不同视图之间导航之后或期间隐藏任何​​按钮。但是,我有以下问题,我似乎没有答案。

我有一个 UITabBarViewController 对象作为根控制器,我在其中添加了许多不同的 UINavigationControllers 对象作为子视图(每个选项卡一个),每个都使用 UITableViewController 对象作为它们的根控制器进行初始化。从每个表格视图都可以导航到一个子控制器,该控制器显示有关所选单元格的更多详细信息。现在我遇到的问题如下:

在每个表格视图的导航控制器中,我设置了一个自定义背景图像。这是通过覆盖 UINavigationBar 的 drawRect 方法来完成的。当用户向下导航到每个表视图的详细视图时,应将图像替换为详细视图的标题。我通过使用全局变量来完成此操作,并在每个视图的每个 viewWillAppear 方法中更新它,并在覆盖的 drawRect 方法中使用 if 条件。所以用一些代码来说明这一点:

在应用程序委托 .h.file 中,我将外部变量声明为:

extern BOOL displayImage;

在应用程序委托 .m 文件中,我将外部变量初始化为:

BOOL displayImage = TRUE;

对于所有视图控制器,viewWillAppear 方法的实现如下:

// View where I want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
   ...

   self.navigationItem.title = nil;      // No title
   displayImage = TRUE;
   [self.navigationController.navigationBar setNeedsDisplay];

   ...
} 

// View where I do NOT want to show the image in the navigation bar
- (void)viewWillAppear:(BOOL)animated {
   ...

   self.title = @"Info";
   displayImage = FALSE;
   [self.navigationController.navigationBar setNeedsDisplay];

   ...
}

// Overwritten drawRect method of UINavigationBar
- (void)drawRect:(CGRect)rect {
   if (displayImage) {
      // Code that draws the image by calling drawInRect
   } else {
      // Code that just sets a black background
   }
}

当我从表视图导航到详细视图(表视图的子控制器)并返回父视图时,这非常有用。但是,当我从详细视图导航到选项卡栏的另一个选项卡时,详细视图的标题消失并且图像重新出现(到目前为止一切都很好),但是当我导航回包含详细视图的选项卡时,详细视图的标题出现,但图像不会消失(即标题和图像都显示在导航栏中)。在这种情况下似乎没有调用 setNeedsDisplay 方法。在所有这些过程中,外部变量都会正确更新。

有没有人可以告诉我我在这里可能做错了什么?

谢谢

4

1 回答 1

0

我也处于同样的情况。如果我遇到您的问题,则在不同选项卡之间切换时,导航栏中的图像不会消失。所以你需要创建两张图像,一张是普通图像,另一张是黑色图像。

使用黑色图像而不是在类别中drawrect方法的else部分设置黑色。并且在从页面切换时重置viewWillDisappear中的变量,而不是在下一页设置变量。可能是你的问题得到解决。

于 2011-09-22T05:53:35.877 回答