2013-10-14 3 views
0

Я хочу, чтобы текст кнопки «ушел» при нажатии кнопки «неправильный ответ».iOS: Анимация текстовой позиции UIButton не работает

В моем демо-коде проблемы у моего проекта есть две кнопки, одна с выходом «myBtn» без каких-либо действий, а другая с действием TouchUpInside. Обработчик действий выглядит следующим образом:

- (IBAction)goPressed:(UIButton*)sender { 

//UILabel *lbl = self.myBtn.titleLabel; 
UILabel *lbl = sender.titleLabel; 
[UIView animateWithDuration:1.0 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        lbl.center = CGPointMake(lbl.center.x-60, lbl.center.y); 
        lbl.alpha = 0; 
       } 
       completion:nil]; 
} 

Я пытаюсь анимировать два свойства: «альфа», чтобы перейти от 1 до 0, и положение текста, чтобы переместить 60 точек влево.

Если я раскомментирую первую строку «UILAbel» и прокомментирую вторую, то нажатие кнопки запускает приятную анимацию во второй кнопке.

Но если я оставлю код по мере его появления, пытаясь анимировать текст нажатой кнопки, альфа анимация прекрасна, но позиция не меняется.

Любая помощь была бы высоко оценена!

+0

Попробуйте с sender.currenttitle –

+0

Почему бы просто не анимировать целую кнопку/установить текст на ""? –

+0

CurrentTitle - это NSString, поэтому я не могу анимировать его положение. – ishahak

ответ

2

Я видел такую ​​проблему, возникающую на iOS7. Анимации, которые отлично работали внутри IBAction, не работают на iOS7. Мне пришлось переместить весь мой код анимации на другой метод и вызвать селектор после задержки. Ваш код будет работать хорошо, если вы сделаете это -

- (IBAction) goPressed:(UIButton*)sender { 
[self performSelector:@selector(animateButton:) withObject:sender afterDelay:0.1]; 
} 

- (void) animateButton:(UIButton *) button{ 
UILabel *lbl = button.titleLabel; 
[UIView animateWithDuration:1.0 
         delay:0.0 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        lbl.center = CGPointMake(lbl.center.x-60, lbl.center.y); 
        lbl.alpha = 0; 
       } 
       completion:nil]; 
} 
+0

Большое спасибо Кедару. Отлично работает! даже с задержкой 0,05. Это интересно, потому что добавление задержки даже на несколько секунд к самой анимации не решило проблему ... – ishahak

+0

@ Kedar это ошибка? потому что это помогает мне даже не знать, почему =/ –

0

Ваша проблема смешивая UIButton с UILabel.

В этом случае параметр метода (UIButton*)sender ссылается на UIButton. Причина UILabel *lbl = sender.titleLabel; не работает, потому что sender является ссылкой UIButton. Чтобы получить доступ к объекту метки, вы должны ссылаться на UILabel, встроенный в UIButton через hirarchy sender > UIButton > UILabel.

Таким образом, код, который вы должны использовать это:

UIButton *button = sender; 
UILabel *lbl = sender.titleLabel; 
[UIView animateWithDuration:1.0 
        delay:0.0 
       options:UIViewAnimationOptionCurveEaseOut 
      animations:^{ 
       lbl.center = CGPointMake(lbl.center.x-60, lbl.center.y); 
       lbl.alpha = 0; 
      } 
     completion:nil]; 
} 

Причина, почему код, как представляется, ведет себя strangly потому, что alpha является собственностью обоих UIButton с и UILabel с. Таким образом, он будет работать, даже если вы неправильно обновите sender.

+0

Спасибо за ответ Эндрю, но я не понимаю. Я ничего не путаю в своем коде. Отправитель - UIButton, и я правильно беру его titleLabel. Я проверю решение Кедара и вскоре – ishahak

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