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

标签 ios objective-c iphone ios7 uinavigationbar

我正在尝试创建一个具有自定义形状的自定义 UINavigationBar,就像这样(忽略透明度)

enter image description here

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

环顾四周我发现this response ,其中解释了我遵循的第一个步骤。

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

- (CGSize) sizeThatFits:(CGSize)size
{
  return CGSizeMake(320.0, 70.0);
}

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

在前面的回答中说 UIBezierPath 可以用来创建自定义形状(甚至有曲线),然后作为 mask 应用。我尝试了这个覆盖 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];
}

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

enter image description here

如您所见,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];
}

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

enter image description here

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

我现在缺少什么?

谢谢!

最佳答案

好吧,我很傻xD

最后我得到了这个问题的解决方案,它比我预期的要简单得多。

步骤如下:

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

2) 在它的初始化里面,写下这几行

UIImage *image = [UIImage imageNamed:@"barBackgroundImageName"];
[self setBackgroundImage:image forBarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault];
[self setShadowImage:[UIImage new]];

这很重要,也是我无法让所有这些东西正常工作的原因,图像的高度必须为 64px。我在 online Apple Documentation 上找到了这个它描述了 UINavigationBar 和状态栏之间的行为。

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

enter image description here

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

关于ios - 具有自定义形状导航栏的 UINavigationController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569210/

相关文章:

ios - 以编程方式设置在 View Controller 上添加的对象的标签

ios - 检测 iOS UIDevice 方向

ios - NSXMLParser 输出 "XMLElement: 0x8d61200"但想要 "XMLElement: Richard"

iphone - CoreData 查找字符串 - NSPredicate 或 for 循环?

iPhone : Moving in 3D Space (stepping sideways using gluLookAt)

iOS - 连接一个/任何蓝牙设备时唤醒应用程序

Master/Detail Storyboard项目中的 IOS 导航栏在 ipad 上是透明的,但在 iphone 上不是

objective-c - 将徽章添加到 Finder 中的文件图标

objective-c - 使用委托(delegate)方法扩展类

ios - ios中的静态库