UIScrollView не вызывает layoutSubviews при масштабировании в iOS 4.0

Я прочитал много вопросов по UIScrollView, заданных здесь, но ни один из них не ответил на эту проблему.

У меня есть UIScrollView, который масштабирует представление, содержащее другие подпредставления. Когда происходит масштабирование, мне нужно, чтобы части представления перемещались в определенные места. Я могу добиться этого, изменив их фреймы соответствующим образом в методе layoutSubviews UIScrollView.

В iOS 3.2 и ниже это отлично работает как для масштабирования пальцем, так и для практического масштабирования с использованием метода zoomToRect: animated:.

В iOS 4.0 и выше это отлично работает только при масштабировании пальцем. При прагматическом масштабировании с использованием zoomToRect: animated: вызов layoutSubviews происходит только один раз (в конце масштабирования). Мне нужно, чтобы этот метод вызывался много раз во время масштабирования, чтобы мои подпредставления могли плавно изменять положение вместе с масштабированием.

Таким образом, в iOS 3.2 вызов layoutSubviews происходит много раз, а в iOS 4.0 вызов layoutSubviews происходит только один раз, когда вы вызываете zoomToRect: animated :. Кто-нибудь знает решение моей проблемы?


person spybart    schedule 27.04.2011    source источник
comment
Это то же поведение, которое я описываю здесь: stackoverflow.com/questions/3993532/   -  person David    schedule 06.06.2011


Ответы (1)


В IOS 4.0 анимация выполняется операционной системой - я предполагаю максимально использовать аппаратное ускорение на основе графического процессора. Недостатком этого является то, что становится сложнее анимировать значения, полученные из другого (анимированного) значения. Как и в вашем случае, позиции вложенных представлений, которые зависят от уровня масштабирования UIScrollView. Для того, чтобы это произошло, вы должны настроить анимацию подвидов так, чтобы она шла параллельно с анимацией масштабирования. Попробуйте что-нибудь вроде:

[UIView animateWithDuration:0.5 delay:0
                    options:UIViewAnimationOptionLayoutSubviews
                 animations:^{
    theScrollView.zoomScale = zoomScale;
    [theScrollView layoutSubViews];
} completion:^(BOOL finished) {}];

Это должно установить свойства кадра подвидов из одного и того же контекста анимации, и, следовательно, они должны быть анимированы вместе операционной системой. Я не уверен, нужен ли явный layoutSubViews или это уже достигается с помощью опции UIViewAnimationOptionLayoutSubviews.

См. Также ответы на этот вопрос: Как заставить UIScrollView отправлять scrollViewDidScroll сообщения во время анимации

person fishinear    schedule 26.09.2011