Я никогда раньше не работал с ограничениями автоматического размещения . У меня есть небольшое новое приложение, над которым я работаю, и я заметил, что представления NIB по умолчанию настроены на автоматическое размещение. Итак, я подумал, что воспользуюсь возможностью поработать с этим и попытаюсь выяснить, что Apple собирается с этим делать.
Первый вызов:
Мне нужно изменить размер MKMapView, и я хочу оживить его в новом положении. Если я сделаю это так, как привык:
[UIView animateWithDuration:1.2f
animations:^{
CGRect theFrame = worldView.frame;
CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
worldView.frame = newFrame;
}];
... тогда MKMapView будет «привязан» к исходной высоте всякий раз, когда будет обновлено одноуровневое представление (в моем случае обновляется заголовок UISegmentedControl [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
).
Так, что я думаю , что я хочу сделать , это изменить ограничения на MKMapView от равен Hight родительского вида, чтобы быть по отношению к верхней части UISegmentedControl , что было покрывающим:V:[MKMapView]-(16)-[UISegmentedControl]
Я хочу, чтобы высота MKMapView уменьшилась, чтобы открывались некоторые элементы управления под видом карты. Для этого, я думаю, мне нужно изменить ограничение с фиксированного полноразмерного представления на такое, в котором нижняя часть ограничена верхом UISegmentedControl ... и я бы хотел, чтобы оно анимировалось по мере уменьшения представления до нового размера.
Как это сделать?
Редактировать - эта анимация не анимируется, хотя нижняя часть представления мгновенно перемещается на 170:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
и nibMapViewConstraint
связан в IB с нижним ограничением вертикального пространства.
источник
Ответы:
После обновления вашего ограничения:
Замените
self.view
ссылкой на содержащий представление.источник
UIViewAnimationOptionBeginFromCurrentState
макета ограничения будут установлены ДО анимации!layoutIfNeeded
чтобы[[self.view superview] layoutIfNeeded];
UIViewAnimationOptionBeginFromCurrentState
.У меня это работает (как iOS7, так и iOS8 +). Щелкните ограничение автоматического макета, которое вы хотите настроить (в построителе интерфейса, например, верхнее ограничение). Затем сделайте это IBOutlet;
Анимировать вверх;
Вернуться к исходному месту
источник
Есть очень хороший учебник от самого Apple, в котором объясняется, как использовать анимацию с авто-раскладкой. Перейдите по этой ссылке, а затем найдите видео под названием «Автоматическая компоновка на примере». В нем рассказывается кое-что интересное об авторазложении, а последняя часть посвящена использованию анимации.
источник
Я сделал эту небольшую демонстрацию доступной . Он показывает, как можно изменить и анимировать ограничения автоматического макета на очень простом примере. Просто взгляните на DemoViewController.m .
источник
Большинство людей используют автоматическое размещение для размещения элементов на своих представлениях и изменения ограничений макета для создания анимации.
Простой способ сделать это без большого количества кода - создать UIView, который вы хотите анимировать в раскадровке, а затем создать скрытый UIView там, где вы хотите, чтобы UIView заканчивался. Вы можете использовать предварительный просмотр в xcode, чтобы убедиться, что оба UIView находятся там, где вы хотите. После этого скройте конечный UIView и поменяйте местами ограничения макета.
Существует подфайл для замены ограничений макета под названием SBP, если вы не хотите писать его самостоятельно.
Вот учебник .
источник
Нет необходимости использовать дополнительные
IBOutlet reference
ограничения, вместо этого вы можете напрямуюaccess
илиupdate
уже применяемое ограничение, применяемое с помощьюProgrammatically
или изInterface Builder
любого представления, использующегоKVConstraintExtensionsMaster
библиотеку. Эта библиотека также управляетCumulative
поведениемNSLayoutConstraint
.Чтобы добавить ограничение высоты в containerView
Чтобы обновить ограничение высоты containerView с помощью анимации
источник