私は持っている:
- を
UIScrollView
UIImageView
前のスクロールビューのサブビューとして (1 つの緑色の円と 1 つの赤色の円がある非常に大きな背景画像です)。2 つのサブビューがあります。- 最初のピン イメージ (白い十字)
- 2 番目のピンの画像 (オレンジ色のカスタム マップ ピン)
両方のピンが円の中心を指す必要があります。
- 白い十字の中心は、緑の円の中心になければなりません
- オレンジ色のマップ ピンの一番下のピークは、赤い円の中心にある必要があります。
これは望ましい動作であり、アプリの起動時に取得しました。
(別の投稿でアンドリュー・マドセンが説明したように、ズーム中に両方のピンが大きな背景画像に合わせてスケーリングされるのを防ぐために、反転変換も正常に適用しました。
ズームイン
/アウトすると、オレンジ色のピン(一種の「 centerOffset") は、その下のピークが赤い円の中心を失ったため、上下に移動しているように見えます
(白い十字は常に円の中心にあるため問題ありません) 。
正しい動作 (起動時) の 1 つの例と、間違った動作の 2 つの例をここで参照してください: https://www.dropbox.com/s/8stjh892wm8yfdb/123.png
また、オレンジ色のピンの MKAnnotationView をサブクラス化し、centerOffset を設定しようとしました。
self.centerOffset = CGPointMake(0,-self.image.size.width/2);
in
- (void)setAnnotation:(id <MKAnnotation>)annotation
です
が、無視されます (おそらく mkmapview にないため)。
ズームイン/ズームアウト中に、オレンジ色のピンの下のピークが赤い円の中心に従うように設定するにはどうすればよいですか?
明確にするために繰り返します。オレンジ色のピンの中心が常に赤い円の中心にあるのは望ましくありません。オレンジ色のピンの一番下の頂点が常に赤い円の中心にあるようにしたいのです。
これはViewControllerのサンプルコードです
#import <QuartzCore/QuartzCore.h>
#import "TestViewController.h"
@implementation TestViewController
@synthesize scrollView;
//SLImageView is my extension of UIImageView with the invertedTransform (see: http://stackoverflow.com/questions/12981201/keep-subviews-of-uiscrollview-from-resizing)
@synthesize backgroundImageView;
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"circles.png"];
self.backgroundImageView = [[SLImageView alloc] initWithImage:image];
self.backgroundImageView.frame = (CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=image.size};
[self.scrollView addSubview:self.backgroundImageView];
// Tell the scroll view the size of the contents
self.scrollView.contentSize = image.size;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Set up the minimum & maximum zoom scales
CGRect scrollViewFrame = self.scrollView.frame;
CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width;
CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height;
CGFloat minScale = MIN(scaleWidth, scaleHeight);
self.scrollView.minimumZoomScale = minScale;
self.scrollView.maximumZoomScale = 4.0f;
self.scrollView.delegate = self;
UIImageView *topWhiteCrossPin = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cross.png"]];
topWhiteCrossPin.center = CGPointMake(110, 304);
UIImageView *topOrangeMapPin = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"centerOffsetPin.png"]];
topOrangeMapPin.center = CGPointMake(284, 288);
[backgroundImageView addSubview:topWhiteCrossPin];
[backgroundImageView addSubview:topOrangeMapPin];
self.scrollView.zoomScale = minScale * 3.5;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return backgroundImageView;
}
@end
完全なサンプル xcode プロジェクトはこちら: https://www.dropbox.com/s/rvohsn1wemd4lyj/AffineTransformExample.zip
前もって感謝します。
ミック