0

我想我将从代码开始......

- (void) mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {
  DLog(@"annotation: %@", [[view annotation] title]);
  self.selectedAnnotation = [view annotation];
 [self.directionsView setHidden:NO];
 [UIView beginAnimations:@"slideup" context:NULL];
 self.directionsView.frame = CGRectOffset(self.directionsView.frame, 0, -self.directionsView.frame.size.height);
 [UIView commitAnimations];
}

我有一张地图,用户可以在其中点击业务,然后从底部向上滑动 uiview“directionsView”。当不止一项业务被挖掘时,就会出现问题。视图不断攀升 49 像素。我如何防止这种情况发生?

我有另一种方法来定义取消选择业务时会发生什么,我尝试使用相同的动画方法,只是反向(使用 setHidden:YES),但没有运气:)

请帮忙漂亮吗?

4

1 回答 1

0

每次调用此方法时,都会从 self.directionView 的原点的 Y 分量中减去:

self.directionsView.frame = CGRectOffset(self.directionsView.frame, 0, -self.directionsView.frame.size.height);

因此,如果您在没有其他任何东西重置视图位置的情况下点击多次,它将继续在其父视图中向上滑动(可能从屏幕顶部滑出,当我不小心这样做时,我总是觉得很有趣)。

最简单的解决方案是定义两个 CGRect,并根据您想要在屏幕上还是在屏幕外显示视图,直接将一个或另一个分配给 self.directionView.frame。您可以连续多次调用这些,并且效果不会像您的示例中那样累积。

CGRect onScreen = CGRectMake(x, y, l, w); //Fill in actual values
CGRect offScreen = CGRectMake(x, larger_value_of_y, l, w); //Again, use actual values

您还可以将框架设置为其正常的“屏幕上”值,并调整 directionView 的 transform 属性,该属性也是可动画的。同样,您可以多次应用这些中的任何一个,并且效果不是累积的。

//on screen
self.directionsView.transform = CGAffineTransformIdentity; //"identity" meaning no change to position
//off screen
self.directionsView.transform = CGAffineTransformMakeTranslation(0, self.directionsView.bounds.size.height); //Shifts 0 pts right, and height pts down

注意上面代码中“边界”的使用。当您更改变换时,框架变得未定义,因此当变换不是身份时,如果您尝试设置框架(或基于当前框架的任何其他计算),视图可能会意外移动。

(免责声明:从内存中键入的代码——未在 XCode 中测试。)

于 2012-07-10T04:06:45.607 回答