2016-04-09 5 views
-1

私は、フロアプランをユーザーにインタラクティブに表示したい場所にアプリケーションを構築しています。つまり、各エリアをタップして詳細を見つけることができます。iOS:Quartz2dでフロアプランを描画する

フロアプラン、シェイプ情報、ポイントのメタデータ情報を持つバックエンドからJSON応答を取得しています。 Quartz(Quartz2dの学習を開始)を使用して、ポイントを解析し、ビュー上に図形を描画する予定です。始めに、私は下のイメージのように見えるシンプルな青いプリントを取った。 Plan Image

青いプリントごとに、中心は(0,0)にあり、4つの点があります。

以下は、私が青いプリントのためにバックエンドから得ている点です。

X:-1405.52, Y:686.18 
X:550.27, Y:683.97 
X:1392.26, Y:-776.79 
X:-1405.52, Y:-776.79 

私はこの

// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect { 
    // Drawing code 

      for (Shape *shape in shapes.shapesArray) { 
       CGContextRef context = UIGraphicsGetCurrentContext(); 
       CGContextSetLineWidth(context, 2.0); 
       CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
       BOOL isFirstPoint = YES; 
       for (Points *point in shape.arrayOfPoints) { 
        NSLog(@"X:%f, Y:%f",point.x,point.y); 
        if (isFirstPoint) { 
         CGContextMoveToPoint(context, point.x, point.y); 
         //[bpath moveToPoint:CGPointMake(point.x,point.y)]; 
         isFirstPoint = NO; 
         continue; 
        } 
        CGContextAddLineToPoint(context, point.x, point.x); 

       } 
       CGContextStrokePath(context); 
      } 

} 

を描くことを試みた。しかし、私は正しいもの Rendered Image

質問ではないに見えた結果、以下の画像を取得しています:

  1. 私は私ですnこれを達成する正しい方向は?

  2. ポイントを-ve方向に描画する方法は?ユーザーが後で/パンなど

をズームインすることができるよう

  • 座標によると、描画は非常に巨大になり、私が最初にそれを描画し、画面に収まるように縮小したいです更新:

    翻訳とスケーリングを使って基本的なことを達成しました。今問題は、描かれたコンテンツをビュー境界に合わせる方法です。私のコーディネイトはかなり大きいので、外れてしまいます。

    下記のテストコードをご覧ください。 それをどのようにフィットさせるか考えていますか?

    DrawshapefromJSONPoints

  • 答えて

    0

    解決方法が見つかりました。今では、ポイントのセットからシェイプを描き、スクリーンにフィットさせることができ、品質を損なうことなくズームできるようになりました。プロジェクトへのリンクを以下で見つけてください。これは、色、異なる形をサポートするために調整することができます、私は現在、ポリゴンだけを扱っています。

    DrawShapeFromJSON

    1

    いくつかの観察:

    あり、このためquartzを使用して何も間違っはありませんが、あなたはヒットテスト領域の要件に言及するのでOpenGLを使用して、それはより柔軟な検索およびスケーリングのかもしれませんリアルタイムでモデル化する。

    CGContextMoveToPointを使用してパスをプロットしたため、コードはと指定されています。ポイントのリストです。これがデータ契約によって保証されている場合は問題ありません。ただし、JSONで複数のクローズドパスが返された場合は、よりインテリジェントなレンダラーを作成する必要があります。

    質問2 & 3は、コンピュータグラフィックスにおけるプライマー(特異モデルビュー行列変換)で覆うことができます。世界の座標が(0,0,0)の中心にある場合は、各頂点にスカラーを適用して頂点を拡大縮小できます。 quartz-2d座標系を使用していない場合は、負の軸上の描画点が意味をなさなくなります(0,0)-(w, h)

    +0

    ありがとうございました。 OpenGLの専門家ではないので、私はQuartzと一緒に予定していました。私の他のアプローチは、ジェスチャ認識装置を持つことができるように、各形状に複数のuiviewを作成し、コードを書き直しています。しかし、もう一度質問があっても、私が座標を与えたとしても、あなたがスクリーンショットをチェックすると描画された線が正しくない。私はいくつかの本を読んでいます。 – anoop4real

    +0

    私はポイントの翻訳を達成しました、私は私の答えを更新しました...あなたはそれを見てみることができますか? – anoop4real