如何使用CGContext方法清除旧数据的绘图?

时间:2014-02-23 19:39:09

标签: ios uiview ios7 cgcontext

我有一个iPad应用程序,我沿x轴绘制一个日期网格,沿y轴向下绘制。然后我在该网格的特定部分绘制彩色条(使用CGContext方法)(见图)。 enter image description here

当我尝试重新绘制网格时,旧条仍在那里!如何清除那里的旧酒吧?我已经尝试过在Google和SO上找到的所有内容,但似乎没有任何效果。

更新1:这里是“驾驶代码”...请注意,没有使用CGRect

CGContextRef currentContext = UIGraphicsGetCurrentContext();  // Get the current graphics context
// Start the line at this point (x,y)
CGContextMoveToPoint(currentContext, column, startPosY);

// compute end point  (additional fDurationSegments takes line width into consideration)
CGContextAddLineToPoint(currentContext, column,  startPosY + (fDurationSegments * FIFTEEN_MINUTE_INCREMENT));

//  draw the colored appointment line
CGContextSetLineDash(currentContext, 0, nil, 0);  //  reset dashed line to straight line
CGContextSetLineWidth(currentContext, LINE_WIDTH);  // Set the width for the lines

CGContextStrokePath(currentContext);  //  draw 'em

更新2:我将另一个UIView放在网格视图的顶部,使其透明并绘制了条形图......仍然没有用新的东西替换旧的东西。

4 个答案:

答案 0 :(得分:1)

来自Apple开发者论坛:

为了使这一切成为可能,需要参与viewController。 viewController需要一个IBOutlet来实现在故事板中创建的实际WeeksAppts视图。您可以通过控制 - 从storyboard中的视图拖动到viewController源代码来创建IBOutlet。视图控制器中的IBOutlet看起来像这样

@property (weak, nonatomic) IBOutlet WeeksAppts *weeksApptsView;

当某些内容发生变化时,视图控制器需要使用一行代码强制更新视图

[self.weeksApptsView setNeedsDisplay];

答案 1 :(得分:1)

经过多次考验和磨难,我找到了解决你遇到的同样问题的方法。我已经在StackOverflow上查看了其他类似的问题但是还没有找到。所以概念如下:

CGContext的明确程序

  1. 画一个红色三角形
  2. CGContextBeginTransparencyLayer(上下文中,无)
  3. 画一个蓝色圆圈
  4. CGContextClearRect(context,bounds)//现在只清除CGContextBeginTransparencyLayer调用后的图形
  5. 画一个黄色方块
  6. CGContextEndTransparencyLayer(上下文)
  7. 结果:您现在在视图中有一个红色三角形和一个黄色方块(蓝色圆圈已删除)

    注意:通过使用CGContextBeginTransparencyLayer和CGContextEndTransparencyLayer,您可以避免创建一个透明的洞,该洞将延伸到应用程序上下文中的每个图形,如果您使用CGContextClearRect而没有上述透明度层程序,则会出现这种情况。

    一个有效的Swift Playground示例:

    import Cocoa
    import XCPlayground
    
    class A:Shape{
        override func drawRect(dirtyRect: NSRect) {
            super.drawRect(dirtyRect)
            let nsctx:NSGraphicsContext/**/ = NSGraphicsContext.currentContext()!
            let context/**/  = nsctx.CGContext
    
            let path:CGMutablePathRef  = CGPathCreateMutable();
            let rectangle:CGRect = CGRectMake(0.0, 0.0,200.0, 200.0);
            CGPathAddRect(path,nil, rectangle);
            CGContextAddPath(context,path)
            CGContextSetFillColorWithColor(context,NSColor.greenColor().CGColor)
            CGContextDrawPath(context, CGPathDrawingMode.Fill)
    
        }
    }
    class B:Shape{
        override func drawRect(dirtyRect: NSRect) {
            super.drawRect(dirtyRect)
            let nsctx:NSGraphicsContext/**/ = NSGraphicsContext.currentContext()!
            let context/**/  = nsctx.CGContext//was graphicsPort
    
            CGContextBeginTransparencyLayer(context, nil);
    
            CGContextAddPath(context,CircleParser.circlePath(100,100,100))
            CGContextSetFillColorWithColor(context,NSColor.purpleColor().CGColor)
            CGContextDrawPath(context, CGPathDrawingMode.Fill)
    
            CGContextClearRect(context, NSMakeRect(0, 0, dirtyRect.width, dirtyRect.height))
    
            CGContextAddPath(context,CircleParser.circlePath(60,60,50))
            CGContextSetFillColorWithColor(context,NSColor.blueColor().CGColor)
            CGContextDrawPath(context, CGPathDrawingMode.Fill)
    
            CGContextEndTransparencyLayer(context);
        }
    }
    
    class Shape:FlippedView{
        init() {
            let frame = NSRect(x: 0, y: 0, width: 300, height: 300)
            super.init(frame: frame)
        }
        /*
         * Required by super class
         */
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    class Container:FlippedView{
        init() {
            let frame = NSRect(x: 0, y: 0, width: 500, height: 500)
            super.init(frame: frame)
            //self.wantsLayer = true
        }
        /*
         * Required by super class
         */
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    }
    class FlippedView:NSView {//Organizes your view from top to bottom
        override var flipped:Bool {
            get {
                return true
            }
        }
    }
    
    let container = Container()
    let a = A()
    let b = B()
    container.addSubview(a)
    container.addSubview(b)
    
    XCPlaygroundPage.currentPage.liveView = container
    

答案 2 :(得分:0)

您应该使用CGContextClearRect来清除之前的图纸,但对于任何类型的严肃答案,请在此处提供您的驱动代码

答案 3 :(得分:0)

[self setBackgroundColor:[UIColor clearColor]];

它清除了之前的所有绘图,并为新绘图提供了一个干净的平板。