2

У меня есть UIImageView, который я хочу медленно анимировать с эффектом панорамирования в фоновом режиме. Мой взгляд фонового изображения имеет четыре ограничения:UIView анимация одного ограничения влияет на другое ограничение

  • Расстояние от верхних к верхнему направляющему макету (ноль)
  • Расстояния от основания до нижнего направляющего макета (ноль)
  • Ширины (постоянная при 850)
  • Ведущего пространство для наблюдения (ноль, подключено к коду как)

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

-(void)animateBackgroundHorizontally:(BOOL)forward{ 
    self.backgroundImageViewLeftMargin.constant = forward ? -500 : 0; 
    [self.backgroundImage setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:30 animations:^{ 
     [self.backgroundImage layoutIfNeeded]; 
    } completion:^(BOOL finished) { 
     [self animateBackgroundHorizontally:!forward]; 
    }]; 
} 

Тогда я называю [self animateBackgroundHorizontally:YES]; в viewWillAppear:. Вот что происходит:

enter image description here

Изображение начинается анимация с неожиданным (но всегда то же самое) расположение (верхний край примерно в середине экрана, где он должен быть в верхней части экрана), правильно анимирует свое окончательное положение, а затем, когда оживление возвращается в исходное местоположение, оно делает анимировать правильно. Единственное свойство, которое я анимирую, - это левое поле. Когда я не вызываю код анимации, он отображается правильно. Почему анимация начинается с неправильного местоположения, как видно на изображении? Я попытался установить self.backgroundImage.translatesAutoresizingMaskIntoConstraints на оба YES (я получил неспособный одновременно удовлетворить constaints ошибки) и NO, но это не сработало. Эта проблема сохраняется как на iOS 6, так и на iOS 7.

ответ

0

Я положил код запуска анимации в viewDidAppear: вместо viewWillAppear:, и проблема исчезла. Insteresting. Пробовал как iOS 6, так и iOS 7, и они оба работают хорошо сейчас.