0

いくつかの要素 textbubble と pin を含む注釈を作成します。注釈を表示するときに吹き出しをオンにしますが、後で吹き出しを閉じて注釈を残したいと思います。

これが私の2つの方法です。サブビューの追加は機能しますが、サブビューの削除は機能しません。

-(void)hideETACountdown {
self.etaView.hidden = YES;
[self.etaView removeFromSuperview];
}

-(void)showETACountdown {

self.etaView = [[UIView alloc] initWithFrame:CGRectMake(-34, -97, 89, 59)];
UIImageView *bg = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WaitBubble_backgroundandshadow.png"]];
[self.etaView addSubview:bg];
UILabel *minLabel = [[UILabel alloc] initWithFrame:CGRectMake(7, 24, 42, 21)];
minLabel.text = @"min";
minLabel.textAlignment = UITextAlignmentCenter;
minLabel.font = [UIFont systemFontOfSize:10];

self.etaLabel = [[UILabel alloc] initWithFrame:CGRectMake(13, 4, 30, 27)];
self.etaLabel.font = [UIFont boldSystemFontOfSize:22];
self.etaLabel.textAlignment = UITextAlignmentCenter;
self.etaLabel.text = @"";

[self.etaView addSubview:minLabel];
[self.etaView addSubview:self.etaLabel];

[self addSubview:self.etaView];

self.etaView.hidden = NO;
}

- (id) initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
{
if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {


    self.canShowCallout = YES;
    self.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    self.innerImage = [[UIImageView alloc] initWithImage:nil];
    self.innerImage.frame = CGRectMake(-15, -38, 32, 39);

    [self addSubview:self.innerImage];

    if(self.showETA) {

        [NSNotificationCenter addUniqueObserver:self
                                       selector:@selector(handleEtaTimeUpdate:)
                                           name:kEtaUpdate
                                         object:nil];
        [self showETACountdown];

    }

}
return self;
}

// アップデート /////

若干の混乱があるようです。上記のコードは、mkmap を保持する viewController ではなく、カスタム アノテーション内のコードです。さらに、選択または選択解除に基づいて注釈全体を非表示または表示したくありません。self.etaView は、注釈の一部にすぎないカスタム ビューです。私の注釈は、カスタム マップ ピンと eta バブルで構成されています。ETA が 0 までカウントダウンされたら、バブル (別名 self.etaView) を削除したいのですが、注釈 (マップ ピン) はずっとマップ上にとどまる必要があります。ETA バブルを非表示にしたいだけです。

mkmap を保持する viewController で、適切な方法で適切な addAnnotation メソッドを使用しています。繰り返しますが、上記のコードはカスタム アノテーション内にあり、カスタム アノテーションは、マップからそれ自体を削除するのではなく、独自の要素を削除する責任を負います。

4

2 に答える 2

2

さあ、なぜ addSubView と removeFromSuperView でこの奇妙なロジックを使用するのでしょうか。MKMapView は、ピンの「データソース」をサポートするように構築されています。あなたが達成しようとしているビューの種類はわかりませんが、これCGRectMake(-34, -97, 89, 59)はひどいようです。ですから、メソッドを使用してください:

-(MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation

このようにして、メソッドを使用して注釈を管理するのに問題はありません

- (void)deselectAnnotation:(id < MKAnnotation >)annotation animated:(BOOL)animated

例えば:

[mapView deselectAnnotation:[mapView.selectedAnnotations objectAtIndex:0] animated:YES];
于 2013-07-07T01:55:09.197 に答える
0

バブルを削除するメソッドが呼び出されていましたが、削除されていませんでしたか? だから私がやったことは、注釈に通知リスナーを作成し、削除したいときに通知を投稿して削除することです。インスタンス メソッドを呼び出すだけでは機能しない理由がわかりませんか?

とにかく、通知はそれを解決しました。アプリを起動できるように先に進む必要があります。

于 2013-07-09T23:10:57.233 に答える