使用 Storyboards 设置自定义导航栏

Posted

技术标签:

【中文标题】使用 Storyboards 设置自定义导航栏【英文标题】:Setting up a custom Nav Bar with Storyboards 【发布时间】:2013-04-30 14:45:35 【问题描述】:

我正在尝试研究如何使用情节提要设置自定义导航栏。我已将导航栏直接添加到我的应用程序的视图控制器中。

VC 不直接在导航控制器堆栈中,但会按原样显示。有点像应用程序的要点。应用程序将使用相同的导航栏。

我想为整个应用程序中的导航栏设置样式。以前我在导航控制器中使用以下内容,但现在不是,也不会在不需要的情况下实际保留在导航堆栈中。

[[UINavigationBar appearance] setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault];

现在它是一个简单地添加到 VC 中的项目,设置此样式的正确方法是什么?该栏也将添加到其他 VC,因此它应该可以重复使用。我试图继承 UINavigationBar 并在故事板中为导航栏更改它,但不确定如何实现样式。

我尝试更改此子类的 drawRect 方法,但没有发生更改。我无法直接从 Apple 找到任何关于如何对其进行子类化和添加样式的文档。

【问题讨论】:

外观代理是如何设置导航栏的样式。你正在做的应该有效。 didFinishLaunchingWithOptions方法中使用AppDelegate.m中的代码,这样您就可以将任何导航栏添加到任何vc 注意:问题已解决,但我无法回答自己的问题或将其删除。 解决方案是什么? 我错误地覆盖了我所拥有的课程,删除它使其正常工作。 【参考方案1】:

好吧,我可以告诉你什么对我有用:

navigationBar 和 UINavigationController 也是子类,因此在它的 initWithCoder 中,您可以使用 setValue:forKey 对其进行分配

- (id)initWithCoder:(NSCoder *)aDecoder 
    if(!(self = [super initWithCoder:aDecoder])) return nil;

    CDANavigationBar *navBar = [[CDANavigationBar alloc] init];
    [self setValue:navBar forKey:@"navigationBar"];

    return self;

在您的 StoryBoard 中,您将 UINavigationController 分配给您自己的。

【讨论】:

太老套了。不要这样做。通过UIAppearance 代理内置了对皮肤控件的支持。 我想我还是老样子。 以旧的方式做事并没有错,但这是一种不受支持的方法,它很脆弱并且随时可能崩溃——Apple 不保证其任何属性都符合键值编码。 这对我来说真的不起作用。 rootViewController 不以这种方式尊重它的 UIBarButtonItems。我认为是因为它使用编码器进行了初始化,然后在不处理之前存在的按钮的情况下重新实例化。如果我错了,请纠正我。【参考方案2】:

在 Xcode 5(可能还有 4)中,您可以将 UINavigationController 的 UINavigationBar 的类更改为您自己的自定义类。然后根据需要在 initWithCoder 中添加您的自定义:。

【讨论】:

【参考方案3】:

你可以试试这样的:

[[UINavigationBar appearanceWhenContainedIn:[YourViewController1 class],
                                            [YourViewController2 class],  nil]  
                         setBackgroundImage:[UIImage imageNamed:@"YourImageName"] 
                              forBarMetrics:UIBarMetricsDefault];

【讨论】:

这是一个相当老的问题,我们从这个开始。但这将是在这里采取的正确方法,因此接受答案。

以上是关于使用 Storyboards 设置自定义导航栏的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏按钮项中添加自定义图像时丢失 Segue 操作

小程序自定义单页面全局导航栏

自定义导航栏按钮

iOS 自定义导航栏笔记

iOS 11导航栏自定义后退按钮问题

Vue 自定义指令