12

私は を持ってUIScrollViewUIImageViewます。これにピンを表示したいimageView。のサブビューとしてピンを追加するとImageView、スケール変換がピンでも発生する場合を除いて、すべてがうまくいきます。私はこの動作を望んでおらず、ピンを同じままにしたいと考えています。

そこで、ピンを別のビューに追加することを選択します。このビューは、ImageView の上にあり、UIScrollView. ご想像のとおり、ここでのアイデアは、マップ上にホバリングし、スケーリングせずに、プロットした場所にピンを表示するレイヤーを作成することです。

レイヤービューに追加されたときのピンは、縮尺の場合は調整されませんImageViewImageViewただし、スケール変換が行われたため、ピンの位置が元の原点 x/y と一致しないという問題が発生します。

基本的に、これはピンのある場所のカスタム マップです。ピンをフロートさせ、ImageView をズームインおよびズームアウトしないようにしようとしていますが、ズームが発生したときにピンを配置した場所を覚えています。

いくつかのコード:

scrollView = [[UIScrollView alloc] initWithFrame:viewRect];

scrollView.delegate = self;
scrollView.pagingEnabled = NO;
scrollView.scrollsToTop = NO;
[scrollView setBackgroundColor:[UIColor clearColor]];
scrollView.clipsToBounds = YES; // default is NO, we want to restrict drawing within our scrollview
scrollView.bounces = YES;
scrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;

imageViewMap = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.png"]];

imageViewMap.userInteractionEnabled = YES;

viewRect = CGRectMake(0,0,imageViewMap.image.size.width,imageViewMap.image.size.height);

//viewRect = CGRectMake(0,0,2976,3928);

[scrollView addSubview:imageViewMap];

[scrollView setContentSize:CGSizeMake(viewRect.size.width, viewRect.size.height)];

iconsView = [[UIView alloc] initWithFrame:imageViewMap.frame];

[scrollView addSubview:iconsView];

後でいくつかのイベントにピンを追加するコード。

[iconsView addSubview:pinIcon];

スケールが発生したときに移動せずにピンをマップ上にホバーさせる方法を見つけようとするのに苦労しています。

4

5 に答える 5

10

すべてのピンをピン専用のビュー (iconsView) に保持するというアイデアは気に入っていますが、imageViewMap と呼ばれるもののサブビューとして追加することにしました。

プロジェクトに QuartzCore.framework ファイルをインポートします。

ビュー コントローラー MyViewController を呼び出します。

#import <QuartzCore/QuartzCore.h>
@interface MyViewController : UIViewController <UIScrollViewDelegate>
@property (retain) UIScrollView *scrollView;
@property (retain) UIImageView *imageView;

// 等々

@implementation MyViewController

@synthesize scrollView;
@synthesize imageView;

ピン ビューまたは DropPinViewController というビュー コントローラーがあると仮定します。画像だけを使用している場合は、UIImageView を使用できますが、私のピンにはラベルがあるため、xib を使用しました。アンカーポイントを配置するため、ピンは xib の下部中央を指す必要があります。

MyViewController の viewDidLoad で、ピン ビューを imageView のサブビューとして追加します。imageView をサブビューとして scrollView に追加します。scrollView のコンテンツサイズを設定します。

scrollView.delegate = self;

次のデリゲート メソッドを使用します。

- (void)scrollViewDidZoom:(UIScrollView *)aScrollView
{   
    for (UIView *dropPinView in imageView.subviews) {       
    CGRect oldFrame = dropPinView.frame;
    // 0.5 means the anchor is centered on the x axis. 1 means the anchor is at the bottom of the view. If you comment out this line, the pin's center will stay where it is regardless of how much you zoom. I have it so that the bottom of the pin stays fixed. This should help user RomeoF.
   [dropPinView.layer setAnchorPoint:CGPointMake(0.5, 1)];
    dropPinView.frame = oldFrame;
    // When you zoom in on scrollView, it gets a larger zoom scale value.
    // You transform the pin by scaling it by the inverse of this value.
    dropPinView.transform = CGAffineTransformMakeScale(1.0/scrollView.zoomScale, 1.0/scrollView.zoomScale);
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageView;
}
于 2011-12-02T03:25:55.757 に答える
0

私は同じ問題を抱えており、ピンの位置を手動で修正するという考えはあまりきれいではありません。次に、デリゲート関数で返されたビューにピンを描画し、viewForZoomingInScrollView:ズームが終了した後にサブビュー (マーカー) のサイズを更新します。

ただし、これは Google マップ アプリで可能ですが、再現することはできません。

もう1つ:「viewForZoomingInScrollView」ではないサブビューをUIScrollViewに追加したときの振る舞いについて誰か説明してもらえますか..?例えば:

UIImageView* marker = [[UIImageView alloc] initWithImage: myMarkerImage];
[marker setCenter: CGPointMake(250,150)];
[myScrollView addSubview: marker];

これは、最初のビューとパン時にうまく機能するようです。ズームすると、これらのサブビューのサイズは変更されません。これは実際に私たちが目指していることですが、問題は、UIView フレームの原点がスクロール ビューを横切ってかなり奇妙な方法で移動することです。ズームインすると、marker.frame.size.originは常に左上隅 (スーパービューの (0,0)) に向かって移動し、実際にズームアウトしているように見えます。「ズームセンター」は常に画面の中心にあるはずなので、これも奇妙ですよね?うーん、今のところわかりません。

バンプ。;)

于 2010-04-13T01:08:03.460 に答える
0

いくつかの推奨事項:

1) Google マップ アプリケーションでは、デフォルトで表示しようとするピンの数が制限されていることがわかります。さらに一致する可能性がある場合でも、中心点に最も近い結果のみが表示されます。

2)スクロールまたはピンチ操作中にピンを一時的に非表示にして、インターフェイスの応答性を維持し、画像ビューの移動が停止した瞬間にピンを再描画できます。

3) 多数のピンを表示してアニメーション化する必要がある場合は、CABasicAnimations を使用してピンと背景を同時にアニメーション化し、背景のスケールを変換するのと同じ計算を使用してピンの位置を変換することも検討できます。これにより、アニメーションがよりスムーズに展開され、かなり低いレベルで実行されるため、表示がスムーズになる可能性がありますが、他の課題と制限が導入されます。

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Animation_Types_Timing/Articles/PropertyAnimations.html#//apple_ref/doc/uid/TP40006672-SW1

バーニー

于 2009-07-08T11:13:41.273 に答える
0

デビッド・ブラウンに感謝します。あなたのコードは、コメントアウトしなければならなかった1行を除いて機能します。私のプロジェクトでは、UIScrollView、次にマップを表示する UIImageView、最後にダブルタップ ジェスチャを感知した後にコードが配置するピン (ボタン) を配置する必要がありました。あなたのコードは、ズームスケールを説明するのに役立ちました。ただし、ピンチしてズームすると、ダブルタップした図面の特定の部分に各ピンが「くっつかない」という制限がありました。この行をコメントアウトしたとき、私は解決策に出くわしました:

//[dropPinView.layer setAnchorPoint:CGPointMake(0.5, 1)];

完全には理解できていませんが、私のコードは機能するようになりました! 他の人が私の経験から恩恵を受けることを願っています。ありがとうデビッド!

于 2012-02-01T16:15:55.723 に答える