【问题标题】:NavigationBarStyle issue when switching from iOS 4 to 5从 iOS 4 切换到 5 时出现 NavigationBarStyle 问题
【发布时间】:2011-10-18 17:30:14
【问题描述】:

升级到 iOS 5 和 Xcode 4.2 后有一点设计问题

这就是我在 iOS 4 中的视图:

1 http://casperslynge.dk/1

这就是它在 iOS 5 中的样子:

2 http://casperslynge.dk/2

在我的导航委托中,我有以下方法可以在顶部绘制“图像”:

- (void)drawRect:(CGRect)rect {
    UIImage *image;
    if(self.barStyle == UIBarStyleDefault){
        image = [UIImage imageNamed: @"topbar_base.png"];
    }
    else{
        image = [UIImage imageNamed: @"nyhedsbar_base.png"];    
    }
    [image drawInRect:CGRectMake(-1, -1, self.frame.size.width+3, self.frame.size.height+3)];
}

在我的控制器内部,我设置了以下内容:

self.navigationBarStyle = UIBarStyleBlack;

为什么它在 iOS 5 中不起作用?

谢谢

【问题讨论】:

  • 您是否对自定义绘图使用子类或类别?

标签: iphone ios coding-style navigationbar


【解决方案1】:

iOS5下,需要使用UIAppearance。看看那个。这是一个有条件地使用它的示例,以便您可以继续支持 iOS4:

// iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}

如您所见,这为 all UINavigationBars 设置了自定义背景图像。你可以用 UIAppearance 做很多事情。您需要将当前正在做的任何自定义内容保留在 drawRect: 中,因为 iOS4 之前的设备仍将使用它,而不是新的 UIAppearance 代码。

【讨论】:

  • 如果您使用子类化(而不是类别,我怀疑 Casper Slynge 可能会这样做),您可以对 iOS5 和以下所有内容使用相同的代码。
  • 在我的特殊情况下,上面的代码是在我们测试 iOS5 兼容性时添加的。我们在一个类别中定义了 drawRect: 来做与 OP 所做的类似的事情。我们为 iOS5 之前的设备保留了 drawRect 代码;显然,它不是在 iOS5 下调用的。另外,上面的 UIAppearance 代码必须比系统调用 drawRect 代码更早(在 application:didFinishLaunchingWithOptions 中)调用才能产生任何效果。
  • 所以上面的代码将适用于每个导航栏。如果我想在两个不同的图像之间切换怎么办?
  • 是的,这基本上就是我要说的 :) 根据 Apple 的文档,在类别中覆盖方法是并且一直是错误的(无意冒犯),但在许多教程中都这样做了。
  • @CasperSlynge 我认为在这种情况下,您可以通过稍微不同的 UIAppearance 使用来实现这一点。我相信您可以为出现在其他类中的类指定外观特征,甚至可以为给定类的对象指定外观特征。老实说,我解决了我的问题并转到下一个问题,而没有深入研究 UIAppearance。 (当然,这样做在我的待办事项清单上!)
猜你喜欢
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多