0

私は iOS 開発の初心者で、ズーム可能でパン可能である必要がある画像 (実際には地図) を表示しようとしています。私の問題は、パンに追従して常に同じ場所を表すオーバーレイを追加する方法がわからないことですが、ズームによってスケーリングされません。いくつかのオーバーレイがあり、それぞれがクリック可能である必要があります。

画像 (マップ) をズームおよびパンするために、私を追加しましUIImageViewたが、UIScrollViewうまく機能しますが、この機能を追加する方法がわかりません。

私はこのスレッドを見つけましたが、彼のオーバーレイは静的であるため、実際には同じ問題ではありません: UIScrollview with two images - Keeping 1 image zoomable and 1 image static (fixed size)

私はアンドロイドで同じアプリケーションを開発しましたが、これを機能させるために、変換マトリックスのおかげでマップのピクセルを画面座標に変換していました.onDrawメソッドをオーバーライドして表示しましたが、方法がわかりませんiOS でも同じことを行いますが、これがより良い解決策かどうかはわかりません。

助けてくれてありがとう。

4

2 に答える 2

2

わかりましたので、それが誰かを助けることができるなら、私はそれを行う方法を見つけました:

背景画像 (マップ) を使用して、scrollView にオーバーレイを追加しました。

+CustomScrollView
----> UIImageView (map)
----> OverlayImageView (overlay)

ズームするには、カスタム スクロールビューに次のメソッドを持つデリゲートが必要です。

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    //The background image with the map
    return mapView;
}

//When a zoom occurs, move the overlay
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    UIImageView* overlayView = [scroll.subviews objectAtIndex:1];
    float x;
    float y;
    float width;
    float height;

    //keep the width and height of the overlay
    width = overlayView.frame.size.width;
    height = overlayView.frame.size.height;
    //Move it to stay over the same pixel of the map, and centers it
    x = (self.overlay.point.x * scroll.zoomScale - width/2);
    y = (self.overlay.point.y * scroll.zoomScale - height/2);

    overlayView.frame = CGRectMake(x,y,width,height);
} 

これにより、ズームは背景画像でのみ発生すると言われていますが、オーバーレイが にあるためUIScrollView、一緒にパンします。scrollViewDidZoomしたがって、注意する必要があるのは、ズームが変更されたときにオーバーレイを移動することだけであり、メソッドでそれを知っています。

タッチ イベントを処理するために、touchEnded:withEvent:ofをオーバーライドし、CustomScrollViewタップが 1 回しかない場合はそれをオーバーレイに転送します。タッチを処理するためにOverlayImageViewこの同じメソッド ( ) をオーバーライドするだけなので、は表示しません。toucheEnded:withEvent:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touch = [touches anyObject];
    // Coordinates in map view
    CGPoint point = [touch locationInView:[self.subviews objectAtIndex:0]];

    //forward
    if(touch.tapCount == 1){
        OverlayImageView* overlayView = [self.subviews objectAtIndex:1];
        CGPoint newPoint = [touch locationInView:overlayView];

        BOOL isInside = [overlayView pointInside:newPoint withEvent:event];

        if(isInside){
            [overlayView touchesEnded:touches withEvent:event];
        }
    }
    // zoom
    else if(touch.tapCount == 2){


        if(self.zoomScale == self.maximumZoomScale){
            [self setZoomScale:[self minimumZoomScale] animated:YES];
        } else {
            CGRect zoomRect = [self zoomRectForScrollView:self withScale:self.maximumZoomScale withCenter:point];            

            [self zoomToRect:zoomRect animated:YES];
            //[self setZoomScale:[self maximumZoomScale] animated:YES];
        }

        [self setNeedsDisplay];

    }
}

これが役立つことを願っています。

于 2012-06-27T09:58:02.763 に答える
0

imageView を overLay として上に配置し、その userInteractionEnabled プロパティを NO に設定できます。次に、プログラムでパンする必要があります。

于 2012-06-26T10:01:07.677 に答える