2012-07-10 3 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: ДА), но не повезло :)

Помощь довольно пожалуйста?

ответ

0

Каждый раз, когда этот метод вызывается,, вы вычитая из компонента Y происхождения в self.directionView в:

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

Итак, если нажать несколько раз без чего-то еще сбросить положение изображения, он будет держать скользя в своем родительском представлении (возможно, в верхней части экрана, который я всегда нахожу интересным, когда я случайно это делаю).

Простейшим решением является определение двух CGR-адресов и прямое назначение одного или другого для 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

Смежные вопросы