3

内部にカスタム ボタンがあるカスタム MKAnnotationView を実装しようとしています。そのビューのフレームにアクセスできないため、MKAnnotation の callout プロパティを使用したくありません。代わりに、MKAnnotationView ビューを使用して、UIView を追加し、カスタム コールアウト バブルを内部に配置しました。タッチがボタンによってキャプチャされても、すべてが正常に機能します。唯一の問題は、MKAnnotationView フレームのサイズを変更することです。MKAnnotationView をサブクラス化するカスタム MKAnnotationView 内の :(void)setSelected:(BOOL)selected animated:(BOOL)animatedメソッドの間にそれを行うことができますが、サイズ変更されたビューを MapView に表示する必要がある場合は、マップをズームインまたはズームアウトすることによってのみ達成されます。needsLayoutandなどを渡そうとしましneedsDisplayたが、成功しませんでした。

私は何を間違っていますか?カスタム MKAnnotationView フレームを更新するために呼び出すことができるように、ズームインおよびズームアウトするときに MapView が呼び出すメソッドは何ですか?

私が作成した CustomMKAnnotationView クラスのコードを次に示します。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{

[super setSelected:selected animated:animated];

if (selected) { 
     self.frame = CGRectMake(0, 0, 170, 66);
     self.backgroundColor = [UIColor lightTextColor];
     self.centerOffset = CGPointMake(54.5, -33);
     self.image = nil;
     [self createBubble];
     [self animateIn];
     [self addSubview:bubbleView];
}else{
     [bubbleView removeFromSuperview];
     self.frame = CGRectMake(0, 0, 13, 17);
     self.centerOffset = CGPointMake(0, 0);
}

}
4

1 に答える 1

4

私は物事をうまく動かすことができました。これを行うための完璧な方法を見つけられなかったと確信していますが、それは私のニーズに適合し、最終的にはユーザーエクスペリエンスに影響を与えませんでした。

フレームが実際にビューに追加されていることがわかりましたがframe origin0,0ビューにあるものがズーム位置の外側に追加されていることを確認しました。

frameカスタムバブルを配置したい場所にを変更できたことに気付いた後。しかし、ズームインまたはズームアウトするframeと、別の位置に移動しました。centerOffsetプロパティがそれを行っていることが判明したので、画面上のまったく同じポイントを参照するようにプロパティとプロパティを一致させる必要があり、結果はかなり満足のいくものでしたframecenterOffsetユーザーエクスペリエンスは流動的です。

MKAnnotationViewこれが、私が作成したサブクラスの下で、それを機能させるためのコードです。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
[super setSelected:selected animated:animated];

if (selected) {

    //here's the trick: setting the frame to a new position and with different size.
    //as the bubble view is added here and matching that point in view with the
    //centerOffset position. The result looks doesn't affect user experience.
    CGRect frame;
    frame = self.frame;
    frame.size = CGSizeMake(170, 66);
    frame.origin = CGPointMake((self.frame.origin.x)-16.5,(self.frame.origin.y)-49);
    self.frame = frame;
    self.centerOffset = CGPointMake(61, -24.5);

    //remove the pin image from the view as the bubble view will be added
    self.image = nil;

    [self createBubble];
    [self animateIn];
    [self addSubview:bubbleView];

}else {

    [bubbleView removeFromSuperview];

    //reset the center offset and the frame for the AnnotationView to reinsert the pin image
    self.centerOffset = CGPointMake(0, 0);
    CGRect frame;
    frame = self.frame;
    //this is the size of my pins image
    frame.size = CGSizeMake(14, 17);
    frame.origin = CGPointMake((self.frame.origin.x)+16.5 ,(self.frame.origin.y)+49);
    self.frame = frame;

    //discover whats the point view image (I have different pin colors here)
    UIImage *pointImage = [[UIImage alloc] init];

    if ([flagStyle isEqualToString:@"friends"]) {

        pointImage = [UIImage imageNamed:@"point_f.png"];

    }else if([flagStyle isEqualToString:@"world"]){

        pointImage = [UIImage imageNamed:@"point_w.png"];        

    }else if([flagStyle isEqualToString:@"my"]){

        pointImage = [UIImage imageNamed:@"point_m.png"];        

    }


    self.image = pointImage;


}

}

内部にボタンがあるコールアウトバブルを使用してカスタムMKAnnotationViewを作成するためのソリューションを探していましたが、インターネット全体で自分のニーズに合ったものを見つけることができませんでした。このソリューションは機能します。それは完璧な実装ではありませんが、仕事をします。私はこれで誰かを助けたいと思っています。

于 2012-05-28T19:23:30.410 に答える