Ответ 1
После обновления вашего ограничения:
[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
Замените self.view
ссылкой на содержащий вид.
Я никогда не работал с ограничениями autolayout. У меня есть небольшое новое приложение, над которым я работаю, и заметил, что просмотры 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 на то, что они равны высоте представления родителя, относительно того, что он охватывает верхнюю часть UISegmentedControl: V:[MKMapView]-(16)-[UISegmentedControl]
Я хочу, чтобы высота MKMapView сокращалась, чтобы выявить некоторые элементы управления под видом карты. Для этого я думаю, что мне нужно изменить ограничение с фиксированного полноразмерного вида на тот, где нижняя часть ограничена вершиной UISegmentedControl... и мне бы хотелось, чтобы она была анимацией, поскольку просмотр сжимается до нового размера.
Как это можно сделать?
Изменить - Эта анимация не анимируется, хотя нижняя часть представления мгновенно перемещается вверх 170:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
и nibMapViewConstraint
подключается в IB до нижнего ограничения по вертикали.
После обновления вашего ограничения:
[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
Замените self.view
ссылкой на содержащий вид.
Это работает для меня (как iOS7, так и iOS8 +). Нажмите на ограничение автоматического макета, которое вы хотите настроить (в построителе интерфейса, например, в верхнем ограничении). Затем сделайте это IBOutlet;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
Анимация вверх;
self.topConstraint.constant = -100;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
Анимация назад в исходное место
self.topConstraint.constant = 0;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
Существует очень хороший учебник из самого яблока, в котором объясняется, как использовать анимацию с автозапуском. Следуйте за этой ссылкой , а затем найдите видео под названием" Автомаркет по примеру", Это дает некоторые интересные вещи об автозапуске, а последняя часть - о том, как использовать анимацию.
Я сделал эту небольшую демонстрационную версию. Он показывает, как ограничения автоматического макета могут быть изменены и анимированы в очень простом примере. Просто взгляните на DemoViewController.m.
Большинство пользователей используют автозапуск для элементов макета в своих представлениях и изменяют ограничения макета для создания анимаций.
Легкий способ сделать это без большого количества кода - это создать UIView, который вы хотите оживить в Storyboard, а затем создать скрытый UIView, где вы хотите завершить UIView. Вы можете использовать предварительный просмотр в xcode, чтобы убедиться, что оба UIViews находятся там, где вы хотите. После этого скройте окончательный UIView и замените ограничения макета.
Существует подкадр для замены ограничений макета, называемых SBP, если вы не хотите писать его самостоятельно.
Нет необходимости использовать больше IBOutlet reference
этого ограничения вместо этого, вы можете напрямую применить access
или update
уже примененное ограничение, либо применяемое Programmatically
, либо из Interface Builder
для любого представления, используя KVConstraintExtensionsMaster
. Эта библиотека также управляет поведением Cumulative
NSLayoutConstraint
.
Чтобы добавить ограничение высоты в контейнерView
CGFloat height = 200;
[self.containerView applyHeightConstrain:height];
Обновление ограничения высоты контейнера с анимацией
[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
if (expectedConstraint) {
expectedConstraint.constant = 100;
/* for the animation */
[self.containerView updateModifyConstraintsWithAnimation:NULL];
}
}];