2013-08-01 2 views
2

Проблема заключается в следующем:Почему UIButton кадр сбрасывается SetTitle: Форстате: метод

В определенный момент, положение кнопки изменяется. После этого название кнопки также должно быть изменено.

Позиция изменяется анимацией (блок анимации UIView), и когда заголовок установлен, кадр возвращается к исходным значениям (перед анимацией).

Итак ... Как я могу это исправить? И почему это происходит?

UPDATE с кодом

CGRect buttonFrame = self.button.frame; 
buttonFrame.origin = CGPointMake(16, 80); 
[UIView animateWithDuration:.4 animations:^{ 
    [self.button setFrame:buttonFrame]; 
}completion:^(BOOL finished){ 
    [self.button setTitle:@"Title" forState:UIControlStateNormal]; // can be here... 
}]; 

Не имеет значения, где я ставлю SETTITLE: Форстат: метод, кадр обратно к исходным значениям.

+1

Я сомневаюсь, что вы сможете получить любую помощь без отображения вашего кода. –

+1

посмотрим какой-нибудь код! – ApolloSoftware

+1

Код или не было – jsedano

ответ

5

Попробуйте отключить автозапуск на вашем UIViewController. Для меня иногда Autolayout вызывает некоторое пристойное поведение макета. Особенно, когда я использую анимацию.

EDIT

Это работает для меня, если Autolayout включен:

[UIView animateWithDuration:.4 animations:^{ 
    self.button.transform = CGAffineTransformMakeTranslation(-200,-200); 
}completion:^(BOOL finished) { 
    [self.button setTitle:@"YourTitle" forState:UIControlStateNormal]; 
}]; 
+0

@RodrigoSalles: Я на 98% уверен, что hw731 верен. –

+0

@ hw731 - Я пробовал это и не работал. –

+0

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

2

Попробуйте использовать transform вместо изменения кадра:

button.transform = CGAffineTransformMakeTranslation(-100,-100);

+0

Это не сработало. –

+0

@RodrigoSalles - Я получаю такое же нежелательное поведение, когда вы пытаетесь анимировать фрейм с включенным Autolayout. Однако, когда я вместо этого использую преобразование внутри блока анимации, при включенном автозапуске он работает правильно. – hgwhittle

+1

Преобразование не меняет рамки, оно применяется после выполнения макета. На него не влияет автоматическое автоопределение или автоматизация, поэтому он работает. @RodrigoSalles, вы должны иметь ошибку в другом месте. – Cyrille

4

Когда вы используете автоматическую раскладку вы не должны устанавливать какие-либо фреймы. Вместо этого, если вы хотите изменить положение кнопки, вы должны сделать IBOutlets для ограничений в IB и изменить их константы. Например, если кнопка имеет ограничение на верхнюю и левую часть экрана (я буду называть их leftCon и Topcon), вы можете сделать это:

[UIView animateWithDuration:.4 animations:^{ 
    self.leftCon.constant = 16; 
    self.topCon.constant = 80; 
    [self.view layoutIfNeeded]; 
}]; 
+0

Практически там ... –

+0

Проблема в том, что я меняю положение других элементов. И [self.view layoutIfNeeded] сбрасывает все кадры, и все элементы пользовательского интерфейса возвращаются в исходное состояние. Похоже ... –

+1

@RodrigoSalles - Вы не должны этого делать, если используете автомат. Либо отключите это, либо выполните все изменения кадра, изменив ограничения. – rdelmar

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