2

iPhone 画面の下部に小さなナビゲーション バーを作成したいと考えています。基本的には、5 つの長方形を並べて描画するだけです。ただし、アクティブなページのみ不透明度を 1.0 に設定し、その他のページはわずかに透明にする必要があります (アルファ = 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 からの描画ではなく、ここからの描画です。以下のようなことを試して、パスを埋めた後にコンテキストをリセットし、1 番目と 2 番目などの両方ではなく、次のブロックを単独で描画するようにします。

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 に答える