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);

したがって、ビューの位置を他にリセットせずに複数回タップすると、親ビューでスライドし続けます (おそらく画面の上部から外れますが、誤ってこれを行うといつも面白いと思います)。

最も簡単な解決策は、2 つの 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

フレームを通常の「画面上の」値に設定し、方向ビューの変換プロパティを調整することもできます。これはアニメーション化も可能です。繰り返しますが、これらのいずれかを複数回適用できますが、効果は累積されません。

//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 に答える