2

マップ注釈がクリックされたときにアニメーション化するストーリーボードに作成したいくつかのラベルを含む UIView があります。アニメーションが少しずれていることを除いて、すべてがうまく機能しています。注釈を初めてクリックしたとき、フレームの位置はアニメーション化されません。しかし、注釈を選択解除してから再度選択すると、それ以降は正常にアニメーション化されます。背景色もアニメーション化しますが、最初の選択でうまく機能しているように見えるので、それが何であれ、おそらくロード時に適切に設定されていないため、フレームプロパティに特有のものですか? 繰り返しますが、ストーリーボードですべてを行ったので、何が欠けているのかわかりません。

ラベル/ビューのコード (すべてストーリーボードに組み込まれ、適切な IBOutlets への参照アウトレットを使用)。ファイル.h:

@property (weak, nonatomic) IBOutlet UIView *stationinfo;
@property (weak, nonatomic) IBOutlet UILabel *stationname;
@property (weak, nonatomic) IBOutlet UILabel *stationsong;
@property (weak, nonatomic) IBOutlet UILabel *stationartist;

ファイル.m:

@synthesize stationinfo;
@synthesize stationname;
@synthesize stationsong;
@synthesize stationartist;

以下のコールバックのコードを見つけてください。

- (void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
    //NSLog(@"Selected ");
    self.stationname.text = ((userStation *)view.annotation).name;
    self.stationsong.text = ((userStation *)view.annotation).song;
    self.stationartist.text = ((userStation *)view.annotation).artist;
    [UIView
     animateWithDuration:0.25
     delay: 0.0
     options: UIViewAnimationCurveEaseInOut
     animations:^ {
        CGRect anim = self.stationinfo.frame;
        anim.origin.y = 0.0;
        self.stationinfo.frame = anim;
        self.stationinfo.backgroundColor = [UIColor redColor];
    }
     completion:^(BOOL finished){
         NSLog(@"DONE!");
     }];
}

- (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
    //NSLog(@"Deselected");
    [UIView
     animateWithDuration:0.25
     delay: 0.0
     options: UIViewAnimationCurveEaseInOut
     animations:^ {
         CGRect anim = self.stationinfo.frame;
         anim.origin.y = -100.0;
         self.stationinfo.frame = anim;
         self.stationinfo.backgroundColor = [UIColor greenColor];
     }
     completion:^(BOOL finished){
         NSLog(@"DONE!");
     }];
}

あなたの助けに感謝します。ありがとうございました。

4

1 に答える 1

0

編集:以下は以前は機能していましたが、実際にはもう必要ないことがわかりました!先日、新しい画面サイズで見栄えがするようにレイアウトに適切な制約などを適用していたときに、ストーリーボードを調整する際のバグを誤って修正したことは想像に難くありません。

私が見つけた回避策は、完全な関数でアニメーションを再度実行することでした。エレガントではありませんが、機能しているようです(最初のアニメーション呼び出しだけが機能しないため、この2番目の呼び出しは完全に機能します)。最初の試行が最初に完了する必要があるため、これにより遅延が発生することに注意してください。位置をアニメーション化するために必要な最初のアニメーションによって初期化されるフレームのいくつかのプロパティがあると思います。

[UIView
         animateWithDuration:0.25
         delay: 0.0
         options: UIViewAnimationCurveEaseInOut
         animations:^ {
            CGRect anim = self.stationinfo.frame;
            anim.origin.y = 0.0;
            self.stationinfo.frame = anim;
        }
        completion:^(BOOL finished){
            CGRect anim = self.stationinfo.frame;
            anim.origin.y = 0.0;
            self.stationinfo.frame = anim;
        }];

あるいは、メインのアニメーションの前にニュートラルアニメーションを起動して、同じ効果があるかどうかを確認することもできます。

于 2012-10-05T16:22:20.877 に答える