防止自定义 UINavigationBar 元素在视图之间更改

Posted

技术标签:

【中文标题】防止自定义 UINavigationBar 元素在视图之间更改【英文标题】:Prevent custom UINavigationBar elements from changing between views 【发布时间】:2013-10-11 18:00:44 【问题描述】:

简单的问题:在我的应用程序的主视图控制器(位于导航控制器中)中,我正在使用如下内容自定义导航栏:

self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"titleImage"]];

UIButton *menuButton = [[UIButton alloc] init];
[menuButton setImage:[UIImage imageNamed:@"menuIcon"] forState:UIControlStateNormal];
[menuButton setFrame:CGRectMake(0, 0, 34, 34)];

UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithCustomView:menuButton];
self.navigationItem.rightBarButtonItem = menuItem;

我希望这些元素(标题视图和右栏按钮)在我将新视图控制器推入和弹出导航控制器时在整个应用程序中保持一致。

当然,我可以在推送到导航堆栈的每个视图控制器的viewDidLoad 中设置我的自定义项,但这意味着在两个视图控制器之间的动画期间,我的自定义项是动画进出的,它不像我想要的那样干净。

关于在从 vc 切换到 vc 时如何在导航栏上维护这些自定义元素有什么建议吗?谢谢!

【问题讨论】:

【参考方案1】:

您可以创建自己的导航项类,它是 UIButton 的子类,并在该类中设置所有外观,然后只需将您的导航项设置为那些自定义 UIButton。

类似这样的:

在 CustomButton.h 中

#import <UIKit/UIKit.h>

@interface CustomButton : UIButton

@end

然后在CustomButton.m中

@implementation CustomButton

- (id)initWithFrame:(CGRect)frame
 
     self = [super initWithFrame:frame];
     if (self) 
            //Set images etc.
            [menuButton setImage:[UIImage imageNamed:@"menuIcon"] forState:UIControlStateNormal];
            [menuButton setFrame:CGRectMake(0, 0, 34, 34)];
        
        return self;
    


/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect

    // Drawing code

*/

@end

然后在你的 viewController 中:

#import CustomButton.h

- (void)viewDidLoad

     CustomButton *button = [[CustomButton alloc]init];
     self.navigationItem.leftBarButton = [[UIBarButtonItem alloc] initWithCustomView:button];

【讨论】:

以上是关于防止自定义 UINavigationBar 元素在视图之间更改的主要内容,如果未能解决你的问题,请参考以下文章

如何防止自定义导航栏拉伸?

如何在 UINavigationBar 上设置自定义按钮?

如何自定义 UINavigationBar

IOS5中如何自定义UINavigationBar

如何在 Swift 中增加自定义 UINavigationBar 类的高度

如何在中间对齐自定义 UINavigationBar 标题(UILabel)(iOS)