【发布时间】:2012-12-12 12:17:59
【问题描述】:
我想在我的 iPhone 屏幕底部创建一个小导航栏,我基本上只是在其中绘制 5 个彼此相邻的矩形。但是,只有活动页面的不透明度应为 1.0,其他页面应略微透明(alpha=0.4)。 这是我已经拥有的。
现在我的问题:
如何更改导航中各个元素的不透明度?每当事情发生变化时,我是否必须重新绘制整个事情?所以我会有名为 nav1Opacity,nav2Opacity...nav5Opacity 的全局变量,在导航更改时更改它们并重绘整个内容?如果是这样,
如何清除我之前绘制的内容?我是否将矩形创建为
CGMutablePathRef()s 并将它们存储在一个数组中并全部清除?
我对绘画的经验很少,所以我有点迷茫。我已经阅读了 Quartz2d 和上下文的文档,但是,正如我所提到的,我还没有完全弄清楚它是如何工作的。
这是我使用的一些代码:
-(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];
}
【问题讨论】:
-
在 OpenGL 启动之前,您基本上处于桶底。因此,当您自己绘图时,有很多样板样的东西必须完成。实际上,您必须自己重新绘制新的不透明度并处理清除它。基本上,当活动元素发生变化时,使用
setNeedsDisplay:将您的自定义视图标记为脏,并在绘图时检查活动元素。 -
你能看看我之前提供的代码吗?它仍然总是在旧导航之上绘制,所以基本上擦除我之前绘制的内容根本不起作用......
-
默认情况下,调用 drawRect 应该清除上次调用 drawRect 时绘制的内容,除非您自己重绘原件。我在您显示的代码中看不到任何可以阻止这种情况发生的内容。
-
好的,我想我解决了这个问题。但我不明白为什么上面的方法不起作用。我的解决方案只是将
CGContextClearRect( context , [self bounds]);添加到我的drawRect 以清除最后绘制的“对象”。但据我了解,drawRect 会重绘我的整个视图,所以如果我在绘制之前保存上下文,导航项应该在下次调用 drawRect 时被“覆盖”,对吧? -
我确实在视图上使用了 CGAffineTransform。这会以某种方式弄乱框架吗?那么我能以某种方式有效地清除边界而不是框架吗?
标签: iphone objective-c drawing drawrect cgcontext