2013-06-10 1 views
10

У меня странная проблема по очень простой задаче.AutoLayout и анимация изменения размера UILabel не работают должным образом при вращении устройства

я нужен очень небольшой настройки, чтобы воспроизвести проблему:

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

В приведенном выше примере мы имеем родительское представление с 2 подвидов -> A UILabel и простой UIView. Им с помощью autolayout применить показано выше раскладка:

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

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

позволяет предположить, что родительский вид имеет размер 200x400 точек на дюйм. когда я строю и запускаю свой пример на портрете, все выглядит нормально. когда я поворачиваюсь в пейзаж, все по-прежнему выглядит нормально. ширина родительских представлений и даже ширина подзапроса увеличены. но теперь, когда я повернуть назад в портрет uilabels шириной сразу же получаешь свою целевую ширину без анимации:

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

родительского вид ширины и UIView подвидов ширина анимированы правильно. его единственная uilabel, которая имеет странное поведение здесь, и я не могу выяснить, что вызывает эту проблему.

+0

Вы создаете иерархию и ограничения программно? В этом случае, вы настроили translatesAutoresizingMaskIntoConstraints на NO? –

+0

Вы поняли это? У меня та же проблема – user18853

ответ

0

Проблема не в том, что UILabel не оживляет его изменение размера, а текст не оживляет. Если вы должны дать ярлыку другой цвет фона, вы обнаружите, что он действительно оживляет, и именно текст переходит в положение.

Одним из способов исправить это было бы изменение ширины метки без анимации и перемещение ее по X точкам, где X - половина разницы между начальной и конечной шириной, а затем просто анимировать ее положение.

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

0

Как я помню, для ограничений вы должны предоставить некоторые дополнительные спецификации, но для таких простых элементов пользовательского интерфейса я бы предложил использовать маски UIViewAutoresizing. Они намного проще и имеют более короткие определения. В вашем случае просто используйте UIViewAutoresizingFlexibleWidth.

0

Его лучше установить autolayout в story board. Убедитесь, что все подменю выбраны в вашем контроллере просмотра при настройке ограничений. Для этого необходимо сделать следующее:

  1. Нажмите на представлении вашего основного контроллера представления
  2. Нажмите Ctrl+A
  3. Нажмите Resolve Авто-раскладка Вопросы
  4. Выберите Добавить недостающие ограничения в вашем View Controller

Тогда ограничение будет установлено для всех подзонов и будет отлично работать во время поворотов.

1

Мои предложений являются:

Если вы подклассы родительского вида использование - (void)layoutSubviews:

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

если вы не подклассов родительского представления можно использовать autoresizingMask:

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth;