iOS: як можна анімувати нове обмеження для автоматичного вимикання (висота)


123

Я ніколи раніше не працював із обмеженнями для автоматичного вимикання . У мене є невеличке нове додаток, над яким я працюю, і помітив, що погляди НІБ є дефолтними для автоматичного розміщення. Отже, я зрозумів, що скористаюся можливістю попрацювати з цим і спробую розібратися, куди 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 до нижнього обмеження вертикального простору.


1
Я знаю, що ви можете легко змінити постійне значення обмеження в блоці [UIView animateWithDuration ..] для анімації зміни висоти. Вам потрібно створити IBOutlet для цього обмеження і підключити його у своєму xib, або іншим чином зберегти посилання на нього, якщо ви створили його в коді (або перегляньте всі обмеження для його пошуку). Не знаю, як анімувати пов'язані зміни, але я читав, що слід змінювати лише постійні, а не інші значення обмеження (для інших значень створіть нове обмеження).
юф

Хм. подумав, що можу, але я не мудрий. Він успішно змінюється і знаходиться в анімаційному блоці, але не анімує!?!
Мелтемi

Знайшов свою відповідь тут: < stackoverflow.com/questions/12926566/… >
Мелтемi

1
Не забувайте [переглянути layoutIfNeeded], це теж була моя проблема. Це те саме питання, яке вирішило мою проблему.
Юф

Відповіді:


179

Після оновлення обмеження:

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

Замініть self.viewпосиланням на містити подання.


4
це працює для самого перегляду, проте погляди, які обмежують цей погляд, просто миттєво рухаються. Що мені робити? ty
dietbacon

7
вам потрібно зателефонувати в макет, якщо це потрібно і для цих представлень. однак це насправді не працює належним чином, оскільки це також оживить оновлення перегляду. Як анімувати коригування обмежень лише в інших видах?
ngb

3
Остерігайтеся: Якщо при використанні UIViewAnimationOptionBeginFromCurrentStateмакета обмеження будуть встановлені перед Анімацією!
Роберт

12
Замість того, щоб дзвонити layoutIfNeededна кожен із цих поглядів, просто зателефонуйте[[self.view superview] layoutIfNeeded];
Flying_Banana

2
@ngb вам потрібно змінити константу обмеження всередині блоку анімації. Таким чином обмеження змінюється з анімацією, і ви можете продовжувати користуватися UIViewAnimationOptionBeginFromCurrentState.
Еран Голдін

86

Це працює для мене (І 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];
    }];

2
ОГО!! Це насправді справді працює! Ця відповідь була для мене відкривачем очей. Велике спасибі! - Ерік
Ерік ван дер Нойт

2
@ErikvanderNeut це теж було для мене, радий, що це було корисно. Відтепер я буду мультифікувати обмеження, а не позицію кадрів.
DevC

не пропустіть додавання: [containerView layoutIfNeeded]; Це гарантує, що всі очікувані операції з компонуванням були завершені перед блоком animateWithDuration.
ingconti

11

Є дуже хороший підручник із самого яблука, який пояснює, як користуватися анімацією з автоматичним розкладом. Перейдіть за цим посиланням, а потім знайдіть відео з назвою "Автоматичний макет на прикладі". Він містить цікаві відомості про авторозкладку, а остання частина - про те, як використовувати анімацію.



1

Більшість людей використовують авторозкладку для компонування елементів у своїх переглядах та модифікують обмеження макета для створення анімації.

Простий спосіб зробити це без великої кількості коду - це створити UIView, який потрібно анімувати, на Storyboard, а потім створити прихований UIView там, де ви хочете закінчити UIView. Ви можете використовувати попередній перегляд у xcode, щоб переконатися, що обидва UIView перебувають там, де ви їх хочете. Після цього схойте кінцевий UIView і поміняйте обмеження для макета.

Існує підфайл для заміни обмежень макета під назвою SBP, якщо ви не хочете писати його самостійно.

Ось підручник .


0

Не потрібно використовувати більше IBOutlet referenceобмежень, замість цього ви можете безпосередньо accessабо updateвже застосовано обмеження або застосовуватись, Programmaticallyабо з Interface Builderбудь-якого виду, використовуючи KVConstraintExtensionsMasterбібліотеку. Ця бібліотека також керує Cumulativeповедінкою NSLayoutConstraint.

Щоб додати обмеження висоти на контейнерView

 CGFloat height = 200;
 [self.containerView applyHeightConstrain:height];

Оновити обмеження висоти контейнераView з анімацією

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
        if (expectedConstraint) {
            expectedConstraint.constant = 100;

            /* for the animation */ 
            [self.containerView  updateModifyConstraintsWithAnimation:NULL];
      }
    }];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.