3

我想开发具有自定义导航栏的应用程序,如下图所示:

在此处输入图像描述

在此处输入图像描述

我认为我需要继承 UINavigationBar 并将按钮添加到导航栏的中心,但我真的不知道如何使导航栏看起来像图像上的那样。你能给我建议我该怎么做吗,任何类型的文档的链接都很棒!

关于 navBar 的类似问题对我没有帮助:

编辑:

接下来是我的想法:使自定义导航栏高度略大于默认大小,并添加带有箭头的背景图像,并在边缘添加一些透明度。

4

4 回答 4

6

如果您想要一个按钮(您可能确实想要),您可以通过子类化来完全实现它UINavigationBar。您应该记住heightofUINavigationBar是只读属性。

样式但不可点击:

所以让我们假设我们将导航栏子类化并在那里添加按钮。你可以这样做,它会看起来很棒。例如:

- (void)drawRect:(CGRect)rect
{
    self.backgroundColor = [UIColor lightGrayColor];
    UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(self.frame.size.width/2-50, 0 , 100, 100)];
    [myButton setBackgroundColor:[UIColor lightGrayColor]];
    [myButton setTitle:@"Normal" forState:UIControlStateNormal];
    [myButton setTitle:@"Highlighted" forState:UIControlStateHighlighted];
    [self addSubview:myButton];
    [self sendSubviewToBack:myButton];
}

但是您将面临一个问题,即您的按钮在下方不可粘贴UINvaigationBar。(我在答案底部贴了一张图片)

因此,显然没有您想要遵循的路径。甚至不要尝试。

样式但不可点击 2:

您可以在导航栏子类中覆盖此方法

- (CGSize) sizeThatFits:(CGSize)size  {
  return CGSizeMake(custom_width, custom_height);
}

然后使用UIBezierPath例如掩盖它

正确的(可点击的)方式:

您必须为您的UINavigationBar. 我将在这里做的(如果你希望它出现在每个屏幕上)是:

  1. 制作一个可以绘制的类别UIViewController(例如 - 这是最简单的方法)UIButton
  2. 任何你想要的样式这个'UIButton'(如果你想要
  3. 将操作固定到“UIButton”: [btn addTarget:self action:@selector(menuShow:) forControlEvents:UIControlEventTouchUpInside];
  4. menuShow:方法应该在您的类别中声明
  5. 每次要重绘视图控制器时都可以调用绘图按钮。

如您所见,将有两个单独的 View:UINavigationBarUIButton. 这允许您在这个小按钮下设置内容并使其可点击。

那么为什么不隐藏导航栏,而使用不同的视图呢?因为 iOS7 ;) 例如,当 Apple 在 iOS7 中更改它时,您必须重建您的伪 NavigationBar,只需要额外的视图,您不需要做任何事情。

在此处输入图像描述

于 2013-11-14T09:11:47.727 回答
2

您不需要继承 UINavigationBar。创建 UIView 将 UIImageView 添加到它作为背景,并带有您需要的形状的图像,添加按钮。

子类 UINavigationController 隐藏 UINavigationBar,添加自定义导航栏。

于 2013-11-11T11:38:24.680 回答
2

首先使用隐藏导航栏 -

self.navigationController.navigationBarHidden = YES;

然后创建具有所需高度的 UIView,navigationBar 的高度为 44px。然后创建背景图像视图,所需 UIButton 的对象并将创建的 UIView 上的所有对象添加为子视图。它看起来像 navigationBar。谢谢。

于 2013-11-14T09:00:49.180 回答
1

您可以将自定义形状的视图添加为导航栏上的 titleView。只要确保 clipsToBounds 设置为 NO,它就不会被剪裁。

于 2013-11-09T17:51:25.930 回答