IOS: Как окунуться в новое ограничение автоопределения (высота)

Я никогда не работал с ограничениями 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 до нижнего ограничения по вертикали.

Ответ 1

После обновления вашего ограничения:

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];

Замените self.view ссылкой на содержащий вид.

Ответ 2

Это работает для меня (как 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];
    }];

Ответ 3

Существует очень хороший учебник из самого яблока, в котором объясняется, как использовать анимацию с автозапуском. Следуйте за этой ссылкой , а затем найдите видео под названием" Автомаркет по примеру", Это дает некоторые интересные вещи об автозапуске, а последняя часть - о том, как использовать анимацию.

Ответ 5

Большинство пользователей используют автозапуск для элементов макета в своих представлениях и изменяют ограничения макета для создания анимаций.

Легкий способ сделать это без большого количества кода - это создать UIView, который вы хотите оживить в Storyboard, а затем создать скрытый UIView, где вы хотите завершить UIView. Вы можете использовать предварительный просмотр в xcode, чтобы убедиться, что оба UIViews находятся там, где вы хотите. После этого скройте окончательный UIView и замените ограничения макета.

Существует подкадр для замены ограничений макета, называемых SBP, если вы не хотите писать его самостоятельно.

Здесь учебник.

Ответ 6

Нет необходимости использовать больше 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];
      }
    }];