0

私は持っている:

  • UIScrollView
  • UIImageView前のスクロールビューのサブビューとして (1 つの緑色の円と 1 つの赤色の円がある非常に大きな背景画像です)。2 つのサブビューがあります。

    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

前もって感謝します。
ミック

4

1 に答える 1

0

テストの別の夜の後、私はついにトリックを見つけました。それは非常に簡単です. [topOrangeMapPin.layer setAnchorPoint:CGPointMake(0.5, 1)];の直後に追加しtopOrangeMapPin.center = CGPointMake(284, 308);ます。これにより、アンカーポイントがオレンジ色のピンの下の真ん中、ちょうどその頂点に設定されます。後続のアフィン変換は、この新しいアンカー ポイントを使用します。このトリックは、私のような初心者にはそれほど明白ではありませんでした

于 2013-10-28T13:03:40.237 に答える