2

非同期ブログ投稿からカスタムマップアノテーションコールアウトコードを正常に実装しました。(ユーザーがマップピンをタップすると、標準のコールアウトビューの代わりにカスタマイズされた画像が表示されます)。

残っている唯一の問題は、コールアウトがビューの幅全体を占めることです。幅が使用している画像に対応していれば、アプリの見栄えがはるかに良くなります。

スクリーンショット

MKAnnotationViewをサブクラス化しましたが、contentWidthを画像の幅に設定すると、三角形が常にピンを指すとは限らないか、画像がラッパービュー内にさえありません。画像が間違っている

どんな助けや提案も素晴らしいでしょう。ありがとう。

4

1 に答える 1

1

iPad 用の CalloutMapAnnotationView を実装するときに、同様の問題に遭遇しました。基本的に、iPad バージョンが mapView の全幅を占めることは望んでいませんでした。

メソッドでprepareFrameSize幅を設定します。

- (void)prepareFrameSize {
    // ...
    // changing frame x/y origins here does nothing
    frame.size = CGSizeMake(320.0f, height);
    self.frame = frame;
}

次に、parentAnnotationView に基づいて xOffset を計算する必要があります。

- (void)prepareOffset {
    // Base x calculations from center of parent view
    CGPoint parentOrigin = [self.mapView convertPoint:self.parentAnnotationView.center 
                                             fromView:self.parentAnnotationView.superview];
    CGFloat xOffset =   0;
    CGFloat mapWidth = self.mapView.bounds.size.width;
    CGFloat halfWidth = mapWidth / 2;
    CGFloat x = parentOrigin.x + (320.0f / 2);

    if( parentOrigin.x < halfWidth && x < 0 ) // left half of map
        xOffset = -x;
    else if( parentOrigin.x > halfWidth && x > mapWidth ) // right half of map
        xOffset = -( x - mapWidth);
    // yOffset calculation ...
}

drawRect:(CGRect)rect吹き出しが描画される前に:

- (void)drawRect:(CGRect)rect {
    // ...
    // Calculate the carat lcation in the frame
    if( self.centerOffset.x == 0.0f )
        parentX = 320.0f / 2;
    else if( self.centerOffset.x < 0.0f )
        parentX = (320.0f / 2) + -self.centerOffset.x;
    //...
}

これがあなたを正しい軌道に乗せるのに役立つことを願っています.

于 2012-07-13T19:38:13.380 に答える