iOS自定义形状导航栏

时间:2013-11-09 16:31:09

标签: ios iphone objective-c xcode

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

enter image description here

enter image description here

我认为我需要子类UINavigationBar并添加按钮到导航栏的中心,但我真的不知道如何使导航栏看起来像在图像上。能否请你给我建议我应该做什么,链接到任何类型的文件都会很棒!

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

编辑:

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

4 个答案:

答案 0 :(得分:6)

如果你想要一个按钮(你可能想要),你可以通过继承UINavigationBar来完全实现它。您应该记住,height UINavigationBar是只读属性。

风格但不可点击:

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

- (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. 中声明
  6. 每次要重绘视图控制器时,都可以调用绘图按钮。
  7. 正如您所看到的那样,会有两个分隔视图:UINavigationBarUIButton。这允许您在此小按钮下设置内容并使其可点击。

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

    enter image description here

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

首先使用 -

隐藏导航栏
self.navigationController.navigationBarHidden = YES;

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

答案 3 :(得分:1)

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