iOS自定义形状导航栏

iOS自定义形状导航栏,ios,iphone,objective-c,xcode,Ios,Iphone,Objective C,Xcode,我想创建一个带有自定义导航栏的开发者应用程序,如下图所示: 我认为我需要将UINavigationBar子类化,并将按钮添加到导航栏的中心,但我真的不知道如何使导航栏看起来像图像上的那个样。你能给我一些建议我该怎么做吗,任何类型的文档链接都会很棒 关于navBar的类似问题对我没有帮助: 编辑: 我接下来的想法是:使自定义导航栏的高度略大于默认大小,并添加带有箭头的背景图像,边缘带有一些透明度。您可以将自定义形状的视图添加为导航栏上的标题视图。 只需确保clipsToBounds

我想创建一个带有自定义导航栏的开发者应用程序,如下图所示:

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

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

编辑:


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

您可以将自定义形状的视图添加为导航栏上的标题视图。
只需确保clipsToBounds设置为“否”,这样它就不会被剪裁。

您不需要将UINavigationBar子类化。创建UIView添加到UIImageView作为背景,图像为所需形状,添加按钮


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

首先使用-

self.navigationController.navigationBarHidden = YES;
然后创建具有所需高度的UIView,导航栏的高度为44px。然后创建背景图像视图,所需UIButton的对象,并将所有对象添加到已创建的UIView上作为子视图。它看起来像导航栏。谢谢。

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

样式但不可点击:

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

- (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
。我在这里要做的是(如果您希望它出现在每个屏幕上):

  • 创建一个可以绘制的
    UIViewController
    类别(例如,这是最简单的方法)
    UIButton
  • 根据您的需要(如果您愿意)设置此“UIButton”的样式
  • 将操作固定到“UIButton”:
    [btn addTarget:自我操作:@selector(menuShow:)forControlEvents:UIControlEventTouchUpInside];
  • menuShow:
    方法应在您的类别中声明
  • 每次要重画视图控制器时,都可以调用“绘图”按钮
  • 正如您所看到的,将有两个单独的视图:
    UINavigationBar
    UIButton
    。这允许您在这个小按钮下设置内容并使其可被点击

    那么为什么不隐藏导航栏,使用不同的视图呢?因为iOS7;)例如,当苹果在iOS7中对其进行更改时,您就必须重建伪导航栏,只需添加其他视图,您无需执行任何操作


    您不需要将UINavigationController子类化。“显示导航栏”有一个选项。谢谢,这正是我要找的!这对我来说将是一个完美的解决方案,但我能得到一点澄清吗?“为UIViewController创建一个可以绘制(例如,这是最简单的方法)UIButton的类别。”这是否意味着UIViewController类别覆盖了-drawRect或类似的内容?类别是在AppDelegate中导入的,还是在UINavigationBar子类中导入的?谢谢否-您不应该在类别中覆盖此方法(任何方法)-调试是一件可怕的事情:)这里的情况是类别常量必须在
    UIViewController
    上绘制一些东西,并在那里锁定目标。为什么?避免在VCs之间复制和粘贴代码。