具有自定义形状导航栏的UINavigationController

Wed*_*rda 4 iphone objective-c uinavigationbar ios ios7

我试图用这样的自定义形状创建一个自定义UINavigationBar(忽略透明度)

在此处输入图片说明

如您所见,此UINavigationBar具有自定义形状,我正在尝试复制它。

环顾四周,我发现了此响应,它解释了我遵循的第一步。

1)我创建了一个名为CustomNavigationBar的UINavigationBar子类。2)我像这样覆盖了sizeThatFits方法:

- (CGSize) sizeThatFits:(CGSize)size
{
  return CGSizeMake(320.0, 70.0);
}
Run Code Online (Sandbox Code Playgroud)

3)这是我迷路的地方...

在前面的回答中,可以说UIBezierPath可用于创建自定义形状(甚至带有曲线),然后用作蒙版。我尝试了这个压倒性的drawRect,但是我得到的只是一个大的黑色导航栏(我的栏颜色设置为红色)。

编辑:我的抽奖是错误的,这是正确的

- (void)drawRect:(CGRect)rect
{
  UIBezierPath *path = [[UIBezierPath alloc] init];
  [path moveToPoint:CGPointZero];
  [path addLineToPoint:CGPointMake(320.0, 0.0)];
  [path addLineToPoint:CGPointMake(320.0, 50.0)];
  [path addQuadCurveToPoint:CGPointMake(0.0, 50.0) controlPoint:CGPointMake(160.0, 90.0)];
  [path closePath];

  [[UIColor redColor] setFill];

  [path fill];
}
Run Code Online (Sandbox Code Playgroud)

编辑:如下所述,我的代码有一些错误,现在它绘制了一些东西。

在此处输入图片说明

如您所见,UIBezierPath正确定义了形状,但是存在一些新问题:

1)状态栏是完全黑色的,在那里没有任何渲染,即使我将其颜色更改为浅色,也不会显示任何内容。我想念什么?

2)由于使用了sizeThatFits方法,所以仍然剩下一些黑色部分。有什么办法可以使该部分透明吗?

谢谢大家!

编辑2:好吧,我完全改变了对这个问题的看法,我想我已经接近解决方案了。现在,我尝试使用透明的png文件作为背景,但仍然需要增加其高度,所以现在这是我的代码。

- (CGSize) sizeThatFits:(CGSize)size
{
   return [[UIImage imageNamed:@"Layer3"] size];
}

- (void)drawRect:(CGRect)rect
{
  [self setClipsToBounds:NO];
  UIImage *image = [UIImage imageNamed:@"Layer3"];
  [image drawInRect:rect];
}
Run Code Online (Sandbox Code Playgroud)

更简单吧?显然,“ Layer3”是我的透明png图像的名称。但是现在,这就是我要得到的。

在此处输入图片说明

如您所见,状态栏没有被png图像覆盖。

我现在想念什么?

谢谢!

Wed*_*rda 5

好吧,我很傻xD

最终,我找到了解决该问题的方法,它比我预期的要简单得多。

步骤如下:

1)子类UINavigationBar,我创建了一个CustomNavigationBar对象。

2)在它的init里面,写这行

UIImage *image = [UIImage imageNamed:@"barBackgroundImageName"];
[self setBackgroundImage:image forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
[self setShadowImage:[UIImage new]];
Run Code Online (Sandbox Code Playgroud)

这很重要,这也是为什么我无法使所有这些东西都起作用的原因,图像的高度必须为64px。我在在线Apple文档中发现了这一点,该文档描述了UINavigationBar和Status Bar之间的行为。

3)仅此而已。这是我的结果(我知道背景不是对称的,只是测试)。

在此处输入图片说明

感谢大家的时间和帮助!!!