AutoLayout CGAffineTransform iOS7 iOS8

В течение нескольких часов я пытался понять, почему автоматическое расположение нарушает мои ограничения в iOS8, а не в iOS7, когда я применяю CGAffineTransformMakeScale. (Я использую XCode 6.0.1 (6A317) с раскадровкой и Autolayout).

Код:

TCTGridController *gridController = self.gridController;
stackController.view.frame = gridController.view.frame;
stackController.stackCollectionView.transform = CGAffineTransformMakeScale(0.1, 0.1);

[gridController.view.superview addSubview:stackController.view];

[UIView animateWithDuration:0.2 animations:^{
    stackController.stackCollectionView.transform = CGAffineTransformMakeScale(1, 1);
    [stackController.stackCollectionView layoutIfNeeded];
} completion:^(BOOL finished) {
    [stackController didMoveToParentViewController:self];
}];

iOS7 результат:

iOS8 результат:

Ошибка ограничения на iOS8:

(
"<NSLayoutConstraint:0x7fa126a9b100 V:[_UILayoutGuide:0x7fa126a9a900]-(120)-[TCTCollectionView:0x7fa125139400]>",
"<_UILayoutSupportConstraint:0x7fa126a8b500 V:[_UILayoutGuide:0x7fa126a9a900(0)]>",
"<_UILayoutSupportConstraint:0x7fa126a8a960 V:|-(0)-[_UILayoutGuide:0x7fa126a9a900]   (Names: '|':UIView:0x7fa126a9a810 )>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa126c86840 h=--- v=--- 'UIView-Encapsulated-Layout-Top' V:[UIView:0x7fa126a9a810]-(0)-|>"
)

Есть идеи?

Alak

3 ответа

Решение

CGAffineTransformIdentity ведет себя по-разному на ios7 и ios8. Это связано с автоматическим макетом и размерами классов. Решение состоит в том, чтобы удалить ограничения, которые конфликтуют с анимацией на ios7.

// solve the constraint-animation problem
if(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
    // iOS7 remove constraints that conflict with animation
    if (self.centerYAlignment != nil) {
    self.view.removeConstraint(self.centerYAlignment) //is an IBOutlet 
    }
} else {
    // iOS8 constraint animations are fine
}

У меня такая же проблема. CGAffineTransformMakeScale отлично работал на iOS7, но вызвал ошибку "Невозможно одновременно удовлетворить ограничения" на iOS8. Для меня решение было добавить de view к родителю и вызвать layoutIfNeeded в подпредставлении до применения преобразования.

До:

subview.transform = CGAffineTransformMakeScale(0.001f, 0.001f);

После:

[view addSubview:subview];
[subview layoutIfNeeded];
subview.transform = CGAffineTransformMakeScale(0.001f, 0.001f);

Проблема исходит от

stackController.view.frame = gridController.view.frame; 

а не из CGAffineTransformMakeScale. Потому что я не снял флажок "Изменить размер из NIB". Чтобы исправить это, снимите флажок "Изменить размер представления из NIB" и добавьте:

[stackController.view setTranslatesAutoresizingMaskIntoConstraints:YES];
Другие вопросы по тегам