我想在iPhone屏幕的底部创建一个小的导航栏,基本上只在彼此相邻的位置绘制5个矩形。但是,仅活动页面的不透明度应为1.0,其他页面的透明度应略微透明(alpha = 0.4)。那就是我已经拥有的。

现在我的问题是:


如何更改导航各个元素的不透明度?每当发生变化时,我是否必须重新绘制整个内容?因此,我将使用名为nav1Opacity,nav2Opacity ... nav5Opacity的全局变量,在导航更改时更改它们并重新绘制整个内容?如果是这样的话,
如何清除我以前画过的东西?我是否将矩形创建为CGMutablePathRef()并将其存储在数组中并全部清除?


我几乎没有绘画方面的经验,所以我在那里有点迷路了。我已经阅读了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];
}

最佳答案

如果您实际绘制了界面,则每当界面改变时,至少在改变的矩形上,都必须重新绘制。您可以重用CGPath,但它们不是屏幕上的图形对象,它们只是有关如何绘制形状的说明,因此您将不得不再次绘制所有内容。

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

10-08 17:00