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 にパンとピンチのジェスチャを実装しました。

今、私はどのようにすべての形状と対話できるかを尋ねています。それを1回タップしたことを検出し、色を変更して、選択した形状にそのようなメニューを表示したいと思います。

誰かが正しい方向を教えてもらえますか?

事前にThx

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 に答える