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它会在执行您的绘图代码之前完全清除该区域。这意味着除非您在单个绘图操作中同时绘制矩形和圆形,否则您drawRect将永远不会在您选择重绘的区域中看到两者都绘制,无论是整个视图边界setNeedsDisplay还是特定区域setNeedsDisplayInRect

解决方案

没有理由不能每次都在其中绘制矩形和圆形,drawRect并通过仅重绘必要的区域来优化绘图性能setNeedsDisplayInRect

或者,您可以使用CALayers分解内容,将矩形放在一层,圆形放在另一层。这将允许您利用Core Animation的动画功能。核心动画提供了一种简单有效的方式来操作屏幕上的图层,其中包含隐式动画,例如移动、调整大小、更改颜色等。

于 2013-03-27T22:49:02.440 回答
0

我猜,CGContextClearRect你的 DrawBall 方法中的调用是矩形消失的责任......来自 Apple 文档:如果提供的上下文是窗口或位图上下文,Quartz 有效地清除矩形。

于 2013-03-27T22:17:45.103 回答