1

我将 UINavigationBar 子类化为在我的应用程序中有一个自定义导航栏。该栏在多个视图控制器上重复使用,其菜单按钮与左按钮项具有相同的样式,这就是它被子类化的原因。

然后将子类添加到情节提要中的 View Controllers 导航栏中。

这是UINavigationBar子类中的代码:

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    UIImage *image = [[UIImage imageNamed: @"mainNavBar"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,5,0,5)];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

-(void)awakeFromNib {
    UIButton *leftButton = [[UIButton alloc]initWithFrame:CGRectMake(7.0f, 7.0f, 38.0f, 29.0f)];
    [leftButton setImage:[UIImage imageNamed:@"menuBarItem"] forState:UIControlStateNormal];
    [leftButton addTarget:nil action:@selector(menuItemPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:leftButton];
}

问题是Rotation of the Device。我还有一些appDidFinishLaunching使用外观 API 进行附加设置的代码:

// Custom Navigation Bar appearance setup
[[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys:
                                                       [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], UITextAttributeTextColor,
                                                       [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5],UITextAttributeTextShadowColor,
                                                       [NSValue valueWithUIOffset:UIOffsetMake(0, 1)],
                                                       UITextAttributeTextShadowOffset,nil]];
// Used to deal with the rotation of the nav bar when implemented outside of Navigation Controller
[[UINavigationBar appearance] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight];
[[UINavigationBar appearance] setContentMode:UIViewContentModeScaleAspectFit];
// Used to push the title down slightly when in Landscape and NavBar outside of Navigation Controller
[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2 forBarMetrics:UIBarMetricsLandscapePhone];

当设备旋转时,就如预期的从 44 到 32 像素的条形高度缩放而言,它一切正常。但是,按钮仍然出现在栏的外侧。 在此处输入图像描述

我已经查看了其他一些关于此的 SO 帖子,但无法弄清楚如何正确完成此操作:iPhone: UINavigationBar with button - 调整高度

UINavigationBar 自动调整大小

理想情况下,我不想处理视图控制器中的自动旋转,因为这个 UINavigationBar 通过大量 VC 重复使用。添加自动轮换代码是否意味着每个 VC 也可能需要这个?

编辑 - 以下答案如果我将其更改awakeFromNib为包括以下内容:

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
    UIImage *menuBgImage = [UIImage imageNamed:@"menuBarItem"];
    UIBarButtonItem *b =[[UIBarButtonItem alloc] initWithImage:menuBgImage landscapeImagePhone:menuBgImage style:UIBarButtonItemStylePlain target:nil action:@selector(menuItemPressed:)];
    ni.leftBarButtonItem = b;
    self.items = @[ni];

我有 UIBarButtonItemStylePlain 破坏图像的问题: 在此处输入图像描述

如果我使用 initWithCustomView 完成之前的设置并使用原始代码中的 leftButton。使用 leftButton 使用 autoresize 来调整高度-然后我会在横向中得到一个严重拉伸的图像?

在此处输入图像描述

编辑 2 - 每个答案的附加图像 在此处输入图像描述

4

1 回答 1

0
[self addSubview:leftButton];

那就是问题所在。这不是向 UINavigationBar 添加内容的方式!您必须从 UINavigationItem 开始并将其按钮设置为 UIBarButtonItem。调整导航栏大小时,将调整栏按钮项。

这是一个让您入门的简单示例(可以进入您的awakeFromNib):

UINavigationItem* ni = [[UINavigationItem alloc] initWithTitle:@"Test"];
UIBarButtonItem* b = [[UIBarButtonItem alloc] initWithTitle:@"Howdy"
    style:UIBarButtonItemStyleBordered
    target:self action:@selector(pushNext:)];
ni.leftBarButtonItem = b;
self.items = @[ni];

但是,请注意,如果您随后将此 UINavigationBar 用作 UINavigationController 的一部分,这将不起作用左栏按钮将被视图控制器的navigationItem. 如果这是标准导航界面的一部分,只需让每个导航控制器都添加左栏按钮项。

此外,您不应该实施drawRect. 改为设置导航栏的背景图像。

于 2013-05-03T16:23:29.083 回答