我有一个iPad应用程序,我沿x轴绘制一个日期网格,沿y轴向下绘制。然后我在该网格的特定部分绘制彩色条(使用CGContext方法)(见图)。
当我尝试重新绘制网格时,旧条仍在那里!如何清除那里的旧酒吧?我已经尝试过在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放在网格视图的顶部,使其透明并绘制了条形图......仍然没有用新的东西替换旧的东西。
答案 0 :(得分:1)
来自Apple开发者论坛:
为了使这一切成为可能,需要参与viewController。 viewController需要一个IBOutlet来实现在故事板中创建的实际WeeksAppts视图。您可以通过控制 - 从storyboard中的视图拖动到viewController源代码来创建IBOutlet。视图控制器中的IBOutlet看起来像这样
@property (weak, nonatomic) IBOutlet WeeksAppts *weeksApptsView;
当某些内容发生变化时,视图控制器需要使用一行代码强制更新视图
[self.weeksApptsView setNeedsDisplay];
答案 1 :(得分:1)
经过多次考验和磨难,我找到了解决你遇到的同样问题的方法。我已经在StackOverflow上查看了其他类似的问题但是还没有找到。所以概念如下:
结果:您现在在视图中有一个红色三角形和一个黄色方块(蓝色圆圈已删除)
注意:通过使用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]];
它清除了之前的所有绘图,并为新绘图提供了一个干净的平板。