2

我有一个带有一些标签的 UIView,我在我的故事板中构建了我想在单击地图注释时对其进行动画处理。我的一切都很好,除了动画有点不对劲。第一次单击注释时,帧位置未设置动画。但是,如果我取消选择然后重新选择注释,它的动画效果会很好。我还为背景颜色设置了动画,这似乎在第一次选择时工作正常,所以无论它是 frame 属性所特有的,也许是因为它在加载时没有正确设置?我再次在故事板中做了所有这些,所以我不知道我错过了什么。

我的标签/视图的代码(全部内置在我的故事板中,并使用正确的 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

编辑:虽然下面的工作之前,我发现它实际上不再需要!我只能想象前几天我在调整我的故事板时无意中修复了这个错误,当时我对我的布局应用了适当的约束等,以确保它在新的屏幕尺寸上看起来不错。

我发现的解决方法是在完整功能中再次执行动画。虽然不优雅,但它似乎可以工作(因为只有第一个动画调用不起作用,第二个动画调用完成了它再次执行)。请注意,这将导致延迟,因为第一次尝试必须先完成。我猜帧的某些属性是由第一个动画初始化的,这是动画位置所需的。

[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 回答