2012-01-09 2 views
1

Итак, у меня есть объект UIView (называемый калибром) с правой стороны, который является вертикальной полосой. У меня есть еще одна метка слева от этой панели, которую я хочу отобразить на разных уровнях вертикальной панели (navLabel). Я хочу, чтобы этот ярлык выглядел так, будто он закреплен на некотором расстоянии (например, 10 пикселей) до моей вертикальной полосы. Мой ярлык оставлен в силе. Я делаю это в различных методах, где мне нужно обновить этикетку:анимация UILabel применительно к другому объекту UIView

 CGSize labelSize = [navLabel.text sizeWithFont:[UIFont fontWithName:@"Arial" size:17.0]]; 
     CGRect newFrame = CGRectMake(gauge.frame.origin.x - 10 - labelSize.width, FIRST_HEIGHT, navLabel.frame.size.width, navLabel.frame.size.height); 
     [UIView animateWithDuration:0.5 animations:^{ 
      self.navLabel.frame = newFrame; 
     }]; 

В моих различных методах, я просто изменить на нужную высоту (т.е. #define FIRST_HEIGHT).

Мой ярлык заканчивается в местах, которые я хочу, но анимация выглядит смешно. Например, если моя первая метка была @"label 1", а мой второй ярлык был @"my much much much longer label", что происходит, этикетка идет на правильную высоту, но поскольку метки имеют разные размеры, вы также видите x-анимацию, что делает ее забавной. Мне нужна анимация только в направлении y. Как я могу это сделать?

Я также испробовал право оправдано, но тогда мой ярлык не доходит до правильного расстояния до моего объекта калибровки. Это заканчивается тем, что пересекало его много раз, и я не уверен, почему это происходит.

ответ

0

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

Или настройте две анимации, используя эти два кадра, которые анимируют сначала направление y, а второе, которое анимирует x-направление к новой x-координате начала кадра. Или наоборот.

// This version simply sets the correct origin (and the correct new width), then animates the y-direction 
CGSize labelSize = [navLabel.text sizeWithFont:[UIFont fontWithName:@"Arial" size:17.0]]; 
self.navLabel.frame = CGRectMake(gauge.frame.origin.x-10-labelSize.width, self.navLabel.frame.origin.y,labelSize.width,navLabel.frame.size.height); 
// now navLabel's frame has the correct new width (and origin x-coord) 
CGRect newFrame = CGRectMake(self.navLabel.origin.x, FIRST_HEIGHT, navLabel.frame.size.width, navLabel.frame.size.height); 
// now this animation will cause movement only in the y-direction 
[UIView animateWithDuration:0.5 animations:^{ 
     self.navLabel.frame = newFrame; 
    }]; 

// This version animates the change in the frame in the x-direction first, then does what it did before 
CGSize labelSize = [navLabel.text sizeWithFont:[UIFont fontWithName:@"Arial" size:17.0]]; 
CGRect newFrame = CGRectMake(gauge.frame.origin.x-10-labelSize.width, self.navLabel.frame.origin.y,labelSize.width,navLabel.frame.size.height); 
// this animation will cause movement in the x-direction 
[UIView animateWithDuration:0.5 animations:^{ 
     self.navLabel.frame = newFrame; 
    }]; 
// now navLabel's frame has the correct new width (and origin x-coord), so set the new y-coord 
CGRect newFrame = CGRectMake(self.navLabel.origin.x, FIRST_HEIGHT, navLabel.frame.size.width, navLabel.frame.size.height); 
// now this animation will cause movement only in the y-direction 
[UIView animateWithDuration:0.5 animations:^{ 
     self.navLabel.frame = newFrame; 
    }]; 
+0

Как я могу охарактеризовать только координату y или координату x? Создать кадр с измененным значением, а затем установить новый фрейм в моем блоке анимации UIView? Спасибо. – Crystal

+0

есть, точно. Если разница между вашими кадрами составляет всего * один * от этих координат, то это все, что будет анимировано. Однако, просто устанавливая кадр перед или после анимации, чтобы обновленная координата x, поскольку ее происхождение также может сделать ее забавной, вам, вероятно, придется поиграть с поведением, чтобы получить то, что хорошо выглядит для вас. Или, как я предположил, вы могли бы анимировать одно «направление», а затем другое. См. Мой обновленный ответ для примера кода. – ddodev

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