【问题标题】:As of 2012, what is the best way to implement a custom navigation bar style on iOS 4截至 2012 年,在 iOS 4 上实现自定义导航栏样式的最佳方式是什么
【发布时间】:2012-01-12 14:49:01
【问题描述】:

我知道两种方法,各有各的缺点:

你们知道有什么更好的方法吗? (同样,它适用于 iOS 4.0,因为我需要该应用与 iOS 4.0+ 兼容)

谢谢大家,

【问题讨论】:

    标签: iphone ios ipad navigationbar


    【解决方案1】:

    您可能需要两种方法,取决于操作系统版本。这是因为在 5.0 及更高版本中,不会调用 drawRect 函数。相反,5.0 有自己的自定义导航栏例程。我最终同时使用了 4.0 和 5.0 方法,并在运行时确定了版本并选择了合适的方法。

    至于第一种方法,我不明白为什么你真的需要界面生成器。只需以编程方式实例化您的对象并将它们添加为子视图。 Interface builder 本身并没有做更多的事情——它只是处理它们的一种更方便的方式。

    【讨论】:

    • 之所以使用IB是因为UINavigationController上的navigationBar是只读的。但是,通过子类化和更改 IB 中导航栏的类,您可以强制导航控制器使用实现 -drawRect: 的子类实例填充它的 navigationBar 属性。
    • 欧文,你能分享你的方法吗?
    【解决方案2】:

    实际上,不需要混搭方法、添加类别或使用Interface Builder,而是可以将UINavigationBar 子类化并使用NSKeyedUnarchiverUINavigationController.navigationBar 的类更改为您的自定义子类。

    + (UINavigationController*)customizableNavigationControllerWithController:(UIViewController*)controller {
    
    NSAssert(controller != nil, @"UINavigationController(CustomNavigationBar) customizableControllerWithController: controller can not be nil");
    
    UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:nil] autorelease];
    
    NSData *navControllerData = [NSKeyedArchiver archivedDataWithRootObject:navController];
    
    NSKeyedUnarchiver *unarchiver = [[[NSKeyedUnarchiver alloc] initForReadingWithData:navControllerData] autorelease];
    
    [unarchiver setClass:[CustomNavigationBar class] forClassName:@"UINavigationBar"];
    
    UINavigationController *customizableNavController = [unarchiver decodeObjectForKey:@"root"];
    
    customizableNavController.viewControllers = [NSArray arrayWithObject:controller];
    
    return customizableNavController;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2013-11-20
      • 2018-06-25
      • 2023-03-09
      相关资源
      最近更新 更多