我正在尝试创建一个自定义的UINavigationBar,具有自定义形状,就像这样(忽略透明度)
正如您所看到的,这个UINavigationBar有一个自定义的形状,我正在尝试复制它。
在寻找资料时,我发现了这个回答,其中解释了我所遵循的第一步。
1)我创建了一个名为CustomNavigationBar的UINavigationBar子类。 2)我重写了sizeThatFits方法,就像这样:
- (CGSize) sizeThatFits:(CGSize)size
{
return CGSizeMake(320.0, 70.0);
}
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];
}
编辑:如下所述,我的代码有一些错误,现在它可以绘制一些东西了。
正如您看到的,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图像的名称。但现在,这就是我得到的东西。
正如您所看到的,状态栏没有被PNG图像覆盖。
我现在缺少什么?
谢谢!