我有一个应用程序,其中一个视图与 MS Visio 配置类似。您可以添加不同的节点(圆圈,从 UIImage 渲染),然后用线条连接它们,以创建类似于树数据表示的东西。添加部分工作正常。
-(void) drawLineToCache{
   // Circle *dad;
   // Circle *kid; 
   //      Circle is a wrapper class for the nodes.. dad and kid are   
   //      private instances declared earlier in this paint view
//associatedPaths is a NSMutableArray that contains Line objects, 
//       which is simply a wrapper class with a CGPathRef
    [dad.associatedPaths addObject:self.selectedLine]; 
    [kid.associatedPaths addObject:self.selectedLine]; 
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, dad.middlePoint.x, dad.middlePoint.y);
    CGPathAddLineToPoint(path, NULL, kid.middlePoint.x, kid.middlePoint.y);
    CGPathCloseSubpath(path);
    CGContextAddPath(cacheContext, path);
    CGContextSetStrokeColorWithColor(cacheContext,[UIColor blackColor].CGColor);
    CGContextStrokePath(cacheContext);
    CGPathRelease(path);
    CGRect dirtyRect = CGRectMake(dad.middlePoint.x-10, dad.middlePoint.y-10, 500, 400);
    [self setNeedsDisplayInRect:dirtyRect];
}
我现在想要做的是移动圆圈,然后删除它们。由于圆圈是 UIImageViews,因此只需更新框架/将其从子视图中删除即可移动/删除它们。
然后为了更新它,我尝试了:
//Ideally this should be implemented in touchesMoved, but I 
//thought it might be too much for the renderer.. 
// movingCircle is simply a reference to which circle needs to be updated 
// (the above kid/dad). I have been able to debug it to the point that the 
// associatedPath arrays contains the correct lines.. 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint touchLocation = [[touches anyObject] locationInView:self];
    for (Line *line in movingCircle.associatedPaths) {
        CGMutablePathRef path = CGPathCreateMutableCopy(line.path);
        CGPathMoveToPoint(path, NULL, line.parentNode.middlePoint.x, line.parentNode.middlePoint.y);
        CGPathAddLineToPoint(path, NULL, line.childNode.middlePoint.x, line.childNode.middlePoint.y);
        CGPathCloseSubpath(path);
        CGContextAddPath(cacheContext, path);
        CGContextSetStrokeColorWithColor(cacheContext,[UIColor blackColor].CGColor);
        CGContextStrokePath(cacheContext);
        CGPathRelease(path);
    }
    [self setNeedsDisplay];
    movingCircle = nil;
}
但它不起作用......我知道这只会画一条新线(而不是删除旧线),但甚至不会做那么多......我也零知道如何删除旧线。 ..
我的问题是:如何对线条做同样的事情?我可以很乐意将每个路径的每个路径存储在一个数组中,但即便如此,在访问路径之后,我该如何更新它们?我需要画一个新的,并以某种方式删除旧的吗?或者我可以简单地更改线的端点之一吗?
提前致谢!:)