1

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

我打算使用 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 中实现了平移和捏合手势。

现在,我在问我如何与每一个形状进行交互。我想检测一次点击,更改他的颜色并在所选形状上显示类似的菜单。

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

提前谢谢

4

1 回答 1

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
            }
        }
    }
}

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

于 2011-06-26T01:36:09.490 回答