2012-07-10 71 views
0

我想我會用代碼開始...滑動的UIView一直保持一個

- (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),但沒有運氣:)

幫助漂亮嗎?

回答

0

這種方法被調用每一次,你從self.directionView原點的Y分量減去:

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

所以,如果你點擊多次,沒有別的重置視圖的位置,它會繼續在其父視圖中滑動(也許在屏幕的頂部,當我不小心做到這一點時,我總是覺得有趣)。

最簡單的解決方案是定義兩個CGRects,並根據您希望視圖在屏幕上還是屏幕外直接指定一個或另一個到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的變換屬性,這也是動畫。再次,您可以應用這些多次,並且效果不是累積的。

//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中測試過。)

+0

第二種方法對我來說是完美的。在這種情況下很容易解決。非常感謝你。 – Coltrane 2012-07-10 05:19:01