1

UIView クラスがあり、メソッドで最初の長方形を描き、時には円を描きたい

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    if ([WhatToDraw isEqual:@"Fields"]) {
        [self DrawField:context];
            }
    if ([WhatToDraw isEqual:@"Ball"]) {
        [self DrawBall:context x:20 y:20];
    }

}

-(void)DrawBall:(CGContextRef)context x:(float) x y:(float) y
{
    UIGraphicsPushContext(context);
    CGRect  rect = CGRectMake(x, y, 25, 25);
    CGContextClearRect(context, rect);
    CGContextFillEllipseInRect(context, rect);
}

-(void)DrawField:(CGContextRef)context 
{

    columns = 6;
    float offset = 5;
    float boardWidth = self.frame.size.width;
    float allOffset = (columns + 2) * offset;
    float currentX = 10;
    float currentWidth = (boardWidth - allOffset) / columns;
    float currentHeight = currentWidth;
    self.fieldsArray = [[NSMutableArray alloc] init];
    //create a new dynamic button board
    for (int columnIndex = 0; columnIndex<columns; columnIndex++) {
        float currentY = offset;
        for (int rowIndex=0; rowIndex<columns; rowIndex++) {
            UIGraphicsPushContext(context);
            //create new field


            CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0);
            CGContextBeginPath(context);
            CGRect rect = CGRectMake(currentX, currentY, currentWidth, currentHeight);
            CGContextAddRect(context, rect);
            CGContextFillPath(context);

            currentY = currentY + offset + currentHeight;
        }
        currentX = currentX + offset + currentWidth;
    }  
}

何を描くかを変える方法もあります

-(void)Draw:(NSString*)Thing
{
    self.WhatToDraw = Thing;
    [self setNeedsDisplay];
}

長方形(フィールド)の描画は問題ありませんが、ボタンをクリックして円を描くと、すべての長方形が消えて円だけが描かれます。既存の長方形に円を描くにはどうすればよいですか?

4

2 に答える 2

4

問題

あなたの問題は、UIViewが でマークされた領域を再描画するsetNeedsDisplaysetNeedsDisplayInRect、描画コードを実行する前にその領域を完全にクリアすることです。これは、内の 1 回の描画操作で長方形と円の両方を描画しない限り、drawRect再描画することを選択した領域に両方が描画されることは決してないことを意味setNeedsDisplaysetNeedsDisplayInRectます。

ソリューション

drawRectで必要な領域のみを再描画することで、毎回長方形と円の両方を描画し、描画のパフォーマンスを最適化できない理由はありませんsetNeedsDisplayInRect

または、 CALayersを使用してコンテンツを分割し、長方形を 1 つのレイヤーに、円を別のレイヤーに配置することもできます。これにより、 Core Animationのアニメーション機能を活用できます。コア アニメーションは、移動、サイズ変更、色の変更などの暗黙的なアニメーションを使用して、画面上のレイヤーを操作するためのシンプルで効果的な方法を提供します。

于 2013-03-27T22:49:02.440 に答える
0

私の推測ではCGContextClearRect、DrawBall メソッドの呼び出しは、長方形が消える責任があります... Appleのドキュメントから: 提供されたコンテキストがウィンドウまたはビットマップ コンテキストである場合、Quartz は効果的に長方形をクリアします。

于 2013-03-27T22:17:45.103 に答える