2014-02-19 3 views
4

Это странно, что я сейчас смотрю прямо сейчас, я знаю, что добавление ограничений в AutoLayout IB просто. Но я действительно не мог понять, почему мои простые ограничения не работают, когда я изменяю размер (ZoomIn Animation) UIView.Ограничения не работают при изменении размера UIView с помощью анимации

View Я нацелился на zoomIn, отлично работает, но в нем нет должного представления. Кажется, что ограничения не работают.

Из этой установки, где в желтых коробках находятся UIViews, а Зеленые коробки - UIImageViews. Когда я постучал по желтой коробке, он должен увеличить масштаб, как показано на фотографии ниже.

enter image description here

Эти ограничения:
enter image description here

Это должно быть ожидаемый в результате на ZoomIn AnimationBut я не получил никакой удачи, желтая коробка ZoomIn но Green Box Выпущено на своей старой позиции и не изменил размер.

Я положил ведущее, конечное, topSpace и bottomSpace из желтой коробки в зеленую коробку. Моего кода для изменения размера желтого ящика является:

- (void) resizeViewWithZoomInAnimation: (UIView*)view duration:(float)secs option:(UIViewAnimationOptions) option { 

//sets the new width and height of deal's view 
float newWidth = view.superview.frame.size.width - 20; 
float newHeight = view.superview.frame.size.height - 20; 

[UIView animateWithDuration:secs delay:0.0 options:option 
       animations: ^{ 

        switch ([view tag]) { 
         case 1: 
          [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, newWidth, newHeight)]; 
          break; 
         case 2: 
          [view setFrame:CGRectMake(CGRectGetMaxX(view.frame),CGRectGetMinY(view.frame), -newWidth , newHeight)]; 
          break; 
         case 3: 
          [view setFrame:CGRectMake(CGRectGetMinX(view.frame),CGRectGetMaxY(view.frame), newWidth , -newHeight)]; 
          break; 
         case 4: 
          [view setFrame:CGRectMake(CGRectGetMaxX(view.frame),CGRectGetMaxY(view.frame), -newWidth, -newHeight)]; 
          break; 
        } 
       } 
       completion:nil]; 
} 

Это должно быть ожидаемым в результате на ZoomIn Animation: image

+0

Откуда вы знаете, что оно не работает? Если вы измените размер UIImageView, это не обязательно изменит размер _image_, отображаемый UIImageView. Поэтому, возможно, изображение будет меняться так, как вы ожидаете. Один из способов узнать: дать изображению цвет фона, чтобы вы могли видеть, где он на самом деле, независимо от изображения, которое оно содержит. – matt

+0

Однако, если UIImageView действительно _isn't_ будет изменен, поскольку его супервизор будет изменен, тогда да, что-то не так с вашими ограничениями. – matt

+0

Причина, по которой я помещаю зеленый цвет фона, - это проверить, работает ли он нормально. Дело в том, что когда-либо были ограничения, которые я поставил, это не работает. Можете ли вы предложить что-нибудь? Спасибо –

ответ

15

При попытке анимации с Автокомпоновкой, вы должны не кадры просматривать изменения непосредственно , Вместо этого вы должны анимировать изменения ограничений.

Для доступа к ограничениям из раскадровки вы можете просто create IBOutlets для них.

[containerView layoutIfNeeded]; // complete pending layout operations (optional) 
[UIView animateWithDuration:1.0 animations:^{ 

    // Update constraints 
    self.viewConstraint1.constant = NEW_VALUE; 
    self.viewConstraint2.constant = NEW_VALUE; 

    // Animate the changes 
    [containerView layoutIfNeeded]; 
}]; 

Обратите внимание, что вы обычно хотите позвонить layoutIfNeeded на супер зрения (или выше) в виде вы пытаетесь оживить.

Я рекомендую прочитать дополнительную информацию об автоматической компоновке в Apple official guide.

+0

Включил мой код для работы таким образом, хорошо работает для изменения размера, но до сих пор вызывается [UIView animateWithDuration: secs delay: 0.0 options: option анимации:^{ [myView setNeedsLayout]; // анимация изменение ограничений } завершение: ноль]; используйте любую анимацию. – deepwinter

1

твик для ответа на данный вопрос, я из в течение UIViewController

[self.view layoutIfNeeded]; 
    [UIView animateWithDuration:.5 
         animations:^{ 
          myConstraint.constant = 64; 
          [self.view layoutIfNeeded]; 
         } 
         completion:^(BOOL finished) { 
          // whatever 
         }]; 

Изменения Примечание: Apple, документы рекомендуется использовать layoutIfNeeded, и называя это как до, так и в блоке анимации. Это позволяет убедиться, что стек анимации очищен до начала.

Кроме того, вы должны вызвать layoutIfNeeded на родительском представлении ограничения, которое вы будете анимировать, а не на представлении, которому принадлежит ограничение. Спасибо @nkukushkin за исходный ответ.

Также важно правильно настроить ваши ограничения. Инструмент «fix constraints» в IB не обязательно будет настраивать их таким образом, чтобы он работал правильно для анимации. Для меня мне пришлось пройти через них и подумать, как я хочу, чтобы зависимости работали, что, конечно же, ожидалось, но может быть неочевидным для новичка (и приводит к ошибкам).

+0

Благодарим за то, что я указал на то, где следует сделать вывод layoutIfNeeded. У меня была аналогичная проблема, и размер изменился отлично, но без анимации. Это фиксировало это. – ecotax

2

Когда вы используете ограничения, генерируются предварительные ограничения. Когда вы действуете по положению и размеру, удалите ограничения во время анимирования представления или выполните следующие действия:

yourView.translatesAutoresizingMaskIntoConstraints = YES; 
Смежные вопросы