如何绘制UIBezierPath并与之交互

时间:2011-06-21 22:26:46

标签: ios uiview uibezierpath

我想在我的应用程序中为建筑物楼层实施和设计地图。在开始之前,我想提出一些建议。

我打算使用UIBezierPath绘制形状。每个UIBezierPath将代表我地图上的商店。 这是一个例子(map_with_UIBezierPath

我的代码结构如下:我有一个UIViewController和一个UiView。在UIViewController“viewDidLoad”方法中,我实例化了UIView,在UIView“drawRect”方法中,我绘制了如下形状(UIBezierPathExtension继承自UIBezierPath):

- (void)drawRect:(CGRect)rect {

context = UIGraphicsGetCurrentContext();

[[UIColor grayColor] setFill]; 
    [[UIColor greenColor] setStroke];

UIBezierPathExtension *aPath = [[UIBezierPathExtension alloc] init]; 
aPath.pathId = 1;
    [aPath moveToPoint:CGPointMake(227,34.25)];
[aPath addLineToPoint:CGPointMake(298.25,34.75)];
[aPath addLineToPoint:CGPointMake(298.5,82.5)];
[aPath addLineToPoint:CGPointMake(251,83)];
[aPath addLineToPoint:CGPointMake(251,67.5)];
[aPath addLineToPoint:CGPointMake(227.25,66.75)];   
    [aPath closePath]; 
aPath.lineWidth = 2;
[aPath fill]; 
[aPath stroke];
[paths addObject:aPath];

UIBezierPathExtension* aPath2 = [[UIBezierPathExtension alloc] init];
aPath2.pathId = 2;
[aPath2 moveToPoint:CGPointMake(251.25,90.5)];
[aPath2 addLineToPoint:CGPointMake(250.75,83.25)];
[aPath2 addLineToPoint:CGPointMake(298.5,83)];
[aPath2 addLineToPoint:CGPointMake(298.5,90.25)];
[aPath2 closePath];
aPath2.lineWidth = 2;
[aPath2 fill]; 
[aPath2 stroke];
[paths addObject:aPath2];   

    ...
}

我还在UIViewController中实现了平移和捏合手势。

现在,我问我如何与每一个形状互动。我想检测一下它,改变颜色并在所选形状上显示that之类的菜单。

有人可以告诉我正确的方向吗?

提前谢谢

1 个答案:

答案 0 :(得分:2)

您需要在视图中查找触摸事件(TouchesBegan,TouchesMoved,TouchesEnded,TouchesCancelled)。触摸后,您可以在视图中询问它的位置。您可以使用此位置来测试该点是否位于您的任何路径中,如果是,请执行您的操作。

使用您的示例代码,这里可能是一个粗略的TouchesBegan ......

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint pointTouched = [touch locationInView:self];
        for (UIBezierPath *path in paths) {
            if ([path containsPoint:point]) {
                // do something cool with your path
                // or more likely, set a flag to do the cool thing when drawing
            }
        }
    }
}

不要忘记你应该处理所有触摸事件并对每个触摸事件做一些合理的事情。此外,上面的代码是多点触控功能,但您可能只想允许一次触摸,在这种情况下,有一些方法可以消除“触摸”循环。