2

ベース イメージ UIImageView (この場合は大きな建物またはサイト プランまたはダイアグラム) を持つ iPad アプリケーションがあり、プランの上に複数の「ピン」を追加できます (視覚的には Google マップに似ています)。これらのピンも UIImageViews であり、タップ ジェスチャでメイン ビューに追加されます。基本イメージは、viewDidLoad のメイン ビューにも追加されます。

ズーム用のピンチ ジェスチャで動作するベース イメージがありますが、明らかにベース イメージをズームすると、すべてのピンがメイン ビューの同じ x 座標と y 座標にとどまり、ベース イメージ (x、y および幅、高さの座標が変更されました)。

これまでのところ、私はこれを持っています...

- (IBAction)planZoom:(UIPinchGestureRecognizer *) recognizer;
{
    recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
    recognizer.scale = 1;

    for (ZonePin *pin in planContainer.subviews) {
        if ([pin isKindOfClass:[ZonePin class]]){
            CGRect pinFrame = pin.frame;

            // ****************************************
            // code to reposition the pins goes here...
            // ****************************************

            pin.frame = pinFrame;
        }
    }
}

ピンの x/y 座標を再配置して、ズームインまたはズームアウトした平面図/ダイアグラムの相対的な位置を保持するための計算を支援する必要があります。ピンは明らかに、幅や高さに関してまったくスケーリング/ズームしたくありません。必要なのは、平面図の初期位置に相対的な新しい x 座標と y 座標だけです。

私は自分で数学を計算しようとしましたが、それを実行するのに苦労しており、残念ながら、SDK に十分に精通しておらず、役立つ組み込みのプロビジョニングがあるかどうかを知ることができません。

この数学関連の問題のヘルプをいただければ幸いです。:)

どうもありがとう、マイケル。InNeedOfMathTuition.com

4

2 に答える 2

2

まず、あなたはあなたをに埋め込もうとするかもしれませんので、ズームはあなたUIImageViewUIScrollViewために大部分達成されます。次に、最大スケールと最小スケールを簡単に設定でき、ズームした画像を必要に応じてスクロールできます(特に、ピンがまたはのサブビューであるUIImageView場合UIScrollView)。

ピンの位置のスケーリングに関しては、各ピンの元のx座標とy座標を保存するのが効果的だと思います(つまり、ビューが最初にロードされたとき、最初に配置されたとき、スケール1.0で)。次に、ビューがズームされたら、を設定x = (originalX * zoomScale)y = (originalY * zoomScale)ます。

私は数年前にiOSアプリで同じ問題を抱えていましたが、正しく思い出せば、それが私がそれを達成した方法です。

編集:以下は私がこれをどのように達成したかについての詳細です(私は今私の古いコードを探しています)。

私はUIScrollViewメインビューのサブビューUIImageViewとして、そしてそのサブビューとしてを持っていました。ボタンがスクロールビューに追加され、参照用に元の場所(ズーム1.0)を保存しました。

方法-(void)scrollViewDidScroll:(UIScrollView *)scrollView

for (id element in myButtons)
{
   UIButton *theButton = (UIButton *)element;
   CGPoint originalPoint = //get original location however you want
   [theButton setFrame:CGRectMake(
       (originalPoint.x - theButton.frame.size.width / 2) * scrollView.zoomScale,
       (originalPoint.y - theButton.frame.size.height / 2) * scrollView.zoomScale,
       theButton.frame.size.width, theButton.frame.size.height)];
}

メソッドについては-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView、を返しましたUIImageView。ボタンのサイズは拡大縮小されていますが、上記のコードには含めていません。ピンのサイズが自動的に拡大縮小されていることがわかった場合は、元のサイズと元の座標を保存して、それをsetFrame呼び出しで使用する必要がある場合があります。

于 2012-05-22T20:17:25.147 に答える
0

アップデート...

おかげで'さん。上記の答えでのジェファーソンの助けは、実装は異なりますが、私はこれを次のように処理することができました...

計画/図の画像をサブビューとして持つscrollViewがあります。scrollViewは、ズーム/パンなどのために設定されています。これには、UIScrollViewDelegateをViewControllerに追加することも含まれます。

ユーザーがプラン/図をダブルタップすると、ピン画像がサブビューとしてタッチポイントのscrollViewに追加されます。ピン画像はカスタムの「ZonePin」クラスであり、UIImageViewから継承し、「baseX」や「baseY」などの追加のプロパティがいくつかあります。

ピンを追加するためのコード...

- (IBAction)planDoubleTap:(UITapGestureRecognizer *) recognizer;
{
    UIImage *image = [UIImage imageNamed:@"Pin.png"];
    ZonePin *newPin = [[ZonePin alloc] initWithImage:image];

    CGPoint touchPoint = [recognizer locationInView:planContainer];
    CGFloat placementX = touchPoint.x - (image.size.width / 2);
    CGFloat placementY = touchPoint.y - image.size.height;

    newPin.frame = CGRectMake(placementX, placementY, image.size.width, image.size.height);
    newPin.zoneRef = [NSString stringWithFormat:@"%@%d", @"BF", pinSeq++];
    newPin.baseX = placementX;
    newPin.baseY = placementY;
    [planContainer addSubview:newPin];
}

次に、scrollViewインタラクションを処理するための2つの関数があり、これは平面画像に対するピンのスケーリング/再配置を処理します。これらの方法は次のとおりです...

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return planImage;
}


- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    for (ZonePin *pin in planContainer.subviews) {
        if ([pin isKindOfClass:[ZonePin class]]){
            CGFloat newX, newY;

            newX = (pin.baseX * scrollView.zoomScale) + (((pin.frame.size.width * scrollView.zoomScale) - pin.frame.size.width) / 2);
            newY = (pin.baseY * scrollView.zoomScale) + ((pin.frame.size.height * scrollView.zoomScale) - pin.frame.size.height);

            CGRect pinFrame = pin.frame;
            pinFrame.origin.x = newX;
            pinFrame.origin.y = newY;
            pin.frame = pinFrame;
        }
    }
}

参考までに、ピンの位置の計算では、ピンの性質上、ピンの画像はx軸の中央に配置されますが、y軸の下部は揃えられています。

これを行うために残された唯一のことは、ズームインしたときにピンを追加するときにscrollViewDidScrollメソッドで使用される計算を逆にすることです。上記のピンを追加するコードは、scrollView.zoomScaleが1.0の場合にのみ正しく機能します。

それ以外は、今ではうまく機能しています!:)

于 2012-05-25T09:59:52.833 に答える