【发布时间】:2014-10-23 12:29:39
【问题描述】:
我正在尝试使用自定义形状创建自定义 UINavigationBar,如下所示(忽略透明度)
如您所见,此 UINavigationBar 具有自定义形状,我正在尝试复制它。
环顾四周,我找到了this response,它解释了我遵循的第一步。
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 图片覆盖。
我现在错过了什么?
谢谢!
【问题讨论】:
-
到目前为止你还没有画任何东西。您创建了一个 BezierPath,但您没有绘制它。
-
这个人完全正确 ;) 查看官方文档的这一部分:developer.apple.com/library/ios/documentation/2ddrawing/… Search for "Rendering the Contents of a Bézier Path Object"
-
谢谢两位。我修改了我的代码,现在画了一些东西,但仍然存在一些问题。我和他们一起编辑了我的问题。谢谢。
标签: ios objective-c iphone ios7 uinavigationbar