我想在我的iPhone屏幕底部创建一个小导航栏,我基本上只绘制5个相邻的矩形。但是,只有活动页面的不透明度应为1.0,其他页面应略微透明(alpha = 0.4)。 这就是我已经拥有的。
现在我的问题:
如何更改导航中各个元素的不透明度?每当有什么变化时,我是否必须重绘整个事物?所以我会有全局变量nav1Opacity,nav2Opacity ... nav5Opacity,当导航更改并重绘整个事物时更改它们?如果是这样,
如何清除之前绘制的内容?我将矩形创建为CGMutablePathRef()
并将它们存储在一个数组中并清除它们吗?
我对绘画的经验很少,所以我在那里迷失了一点。我已经阅读了Quartz2d和contexts的文档,但是,正如我所提到的,我还没有完全弄清楚它是如何工作的。
以下是我使用的一些代码:
-(void)drawRect:(CGRect)rect{
CGContextRef context = UIGraphicsGetCurrentContext();
//save state
CGContextSaveGState(context);
//NAV1
CGMutablePathRef nav1 = CGPathCreateMutable();
CGPathAddRect(nav1, NULL, CGRectMake(0 , 15, 64, 10));
UIColor *blueColor = UIColorFromRGB(0x35BFE5,0.1);
CGColorRef bC = [blueColor CGColor];
[colorArray addObject:(__bridge id)bC];
[navArray addObject:(__bridge id)nav1];
CGPathRelease(nav1);
/*
*
*
... I do this for all 5 navigation elements
*
*
*/
//then I go through all my rectangles and add/fill them
for(int i=0;i<[navArray count];i++){
CGContextAddPath(context, (__bridge CGMutablePathRef)[navArray objectAtIndex:i]);
CGContextSetFillColorWithColor(context, (__bridge CGColorRef)[colorArray objectAtIndex:i]);
CGContextFillPath(context);
}
// restore to last saved context state
CGContextRestoreGState(context);
}
//and this is how I redraw
-(void)updateActiveNav{
[navArray removeAllObjects];
[colorArray removeAllObjects];
[self setNeedsDisplay];
}
答案 0 :(得分:1)
这是问题所在:
for(int i=0;i<[navArray count];i++){
CGContextAddPath(context, (__bridge CGMutablePathRef)[navArray objectAtIndex:i]);
CGContextSetFillColorWithColor(context, (__bridge CGColorRef)[colorArray objectAtIndex:i]);
CGContextFillPath(context);
}
您将添加上下文的路径,然后设置填充颜色,然后填充它。然后,如果没有恢复您的上下文,您将再次执行此操作,以便填充上一个路径和新路径。它不是从最后的drawRect绘制它的绘图从这里。尝试类似下面的内容,以便在填充路径后重置上下文并自行绘制下一个块,而不是第一个和第二个等。
for(int i=0;i<[navArray count];i++){
CGContextSaveGState(context);
// Add Path, Fill
CGContextRestoreGState(context);
}
答案 1 :(得分:1)
如果你实际上绘制界面,你必须在它改变时重绘它,至少是改变的矩形。您可以重用CGPath,但它们不是屏幕上的图形对象,它们只是如何绘制形状的说明,因此您必须再次绘制所有内容。
话虽这么说,你可以使用单独的UIViews代表屏幕上的对象,你可以改变它们的不透明度,这将反映在屏幕上。