Автоматическая компоновка, поворот экрана и анимация UIView

У меня проблема с UIView, которую я добавляю в нижнюю часть экрана и оживляю ее, чтобы заполнить большую часть экрана, если нажата кнопка. Представление будет анимировать вверх и вниз и вращаться по назначению. Если я пытаюсь анимировать в пейзаже, он ломается и дает мне сообщение об ошибке:

*** Assertion failure in -[UIScrollView _edgeExpressionInContainer:vertical:max:], /SourceCache/UIKit_Sim/UIKit-2380.17/NSLayoutConstraint_UIKitAdditions.m:2174 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Autolayout doesn't support crossing rotational bounds transforms with edge layout constraints, such as right, left, top, bottom. The offending view is: <UIView: 0x9199340; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x91993d0>>' 

Оскорбительный взгляд – self.view.

Как я создаю UIView:

 [self.myContentView addSubview:subBar.filterListView]; [self.myContentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filterListView]|" options:0 metrics:nil views:@{@"filterListView": subBar.filterListView}]]; subBar.filterListView.bottomConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.mapView attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; subBar.filterListView.topConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.mapView attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; [self.myContentView addConstraint:subBar.filterListView.bottomConstraint]; [self.myContentView addConstraint:subBar.filterListView.topConstraint]; 

self.myContentView – это UIView, который обрабатывает все self.view:

 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(contentView)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(contentView)]]; 

Чтобы анимировать subBar.filterListView, я удаляю верхний и нижний предел, переназначаю их, добавляю и анимируем:

 [self.myContentView removeConstraint:view.topConstraint]; [self.myContentView removeConstraint:view.bottomConstraint]; view.topConstraint = [NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.topToolBar attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; view.bottomConstraint.constant -= SUB_BAR_SIZE.height; [self.myContentView addConstraint:view.topConstraint]; [self.myContentView addConstraint:view.bottomConstraint]; [self.myContentView setNeedsUpdateConstraints]; [UIView animateWithDuration:.25 animations:^{ [self.myContentView layoutIfNeeded]; }]; 

Является ли код запутанным сверху и снизу, когда он вращается? Думает ли он, что портретный портрет – это левый пейзаж?

  • iOS + Autolayout: метка UITableViewCell + ширина поля текста с вращением
  • Автоматическая компоновка: Y Позиция как максимум двух значений
  • AutoLayout Динамический .xib Высота просмотра
  • iOS ScrollView требует ограничения для позиции или высоты y
  • Кнопка изменения размера автозапуска на основе текста и наличие свободного пространства для заполнения текстового поля
  • В чем разница между внутренними размерами и ограничениями ширины / высоты системы?
  • UILabel autoLayout не работает нормально
  • Изменение размера UITextView внутри UITableViewCell с автозагрузкой iOS
  • 3 Solutions collect form web for “Автоматическая компоновка, поворот экрана и анимация UIView”

    Хорошо, я нашел решение. Это не устраняет вышеупомянутую проблему, а скорее находит другой способ приблизиться к ней.

    Вместо этого я изменил свои ограничения на метод Visual Format Language (VFL):

     subBar.filterListView.verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[filtersSubBar][filterListView(0)]" options:0 metrics:nil views:@{@"filterListView": subBar.filterListView, @"filtersSubBar" : subBar.filtersSubBar}]; 

    Я думаю, что проблема заключалась в использовании атрибутов NSLayoutAttributeTop , NSLayoutAttributeRight и т. NSLayoutAttributeTop , NSLayoutAttributeRight вызывали проблему.

    Autolayout не смог обработать вращение и попытаться использовать NSLayoutAttributeTop когда он должен был быть изменен на NSLayoutAttributeRight чтобы выразить новую ориентацию. Полагаю, мы могли бы вручную изменить ограничение.

    Кажется, VFL обрабатывает его по-разному и не использует атрибуты?

    Это похоже на то, что это либо ошибка, либо просто недостаток iOS.

    Для любого, кто приходит сюда из google: у меня было это исключение, вызывая контроллер PresentView в моем настраиваемом PushSegue:

     @implementation PushSegue - (void) perform { UIViewController* fromController = (UIViewController*) self.sourceViewController; UIViewController* toController = (UIViewController*) self.destinationViewController; CATransition* transition = [CATransition animation]; BOOL iPad = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad; transition.duration = iPad ? 0.5 : 0.3; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; switch ([UIApplication sharedApplication].statusBarOrientation) { case UIInterfaceOrientationPortraitUpsideDown: transition.subtype = kCATransitionFromLeft; break; case UIInterfaceOrientationLandscapeLeft: transition.subtype = kCATransitionFromBottom; break; case UIInterfaceOrientationLandscapeRight: transition.subtype = kCATransitionFromTop; break; default: transition.subtype = kCATransitionFromRight; break; } [fromController.view.window.layer addAnimation:transition forKey:nil]; [fromController presentViewController:toController animated:NO completion:nil]; } @end 

    Причина в том, что для некоторого недоразумения у меня было это в моем коде:

     [self.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 

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

    Вы правы, автоматический макет не работает с анимационными преобразованиями, которые влияют на прямоугольник выравнивания объекта пользовательского интерфейса.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.