2

我想在我的 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];
}
4

2 回答 2

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);
}
于 2012-12-12T13:43:08.650 回答
1

如果您实际绘制界面,则无论何时更改都必须重新绘制它,至少是更改的矩形。您可以重复使用 CGPath,但它们不是屏幕上的图形对象,它们只是有关如何绘制形状的说明,因此您必须重新绘制所有内容。

话虽如此,您可以改用代表屏幕对象的单个 UIView,并且您可以更改它们的不透明度,这将反映在屏幕上。

于 2012-12-12T13:45:47.347 回答