iPhone: как перерисовать подвиды при масштабировании uiscrollview щипком

Я разрабатываю приложение для iPhone, которое размещает несколько настраиваемых UIView в качестве подпредставлений в UIScrollView. Подвиды размещаются друг над другом как прозрачные виды, поскольку каждый вид имеет свои собственные процедуры рисования, которые отслеживают части базового вида. Базовое представление - это UIImageView, который обычно представляет собой большое изображение, которое я хочу, чтобы пользователь мог панорамировать, увеличивать и уменьшать масштаб.

Проблема, с которой я столкнулся, заключается в том, что когда я увеличиваю и уменьшаю масштаб своего UIScrollView, подвиды не перерисовываются, пока пользователь увеличивает масштаб. Я могу правильно изменить положение и масштабирование подвидов после завершения масштабирования, но пользовательский опыт менее чем желателен. Мне не удалось найти способ скрыть или перерисовать подвиды, поскольку происходит масштабирование для масштабирования подвидов вместе с ImageView.

Любые идеи?

Благодарность!

Вот код, который я реализовал:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {

 for (UIView *view in subViews)
 {
  [view updateView:scale];
 }
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *) scrollView {
 return imageView;
}

person Mike    schedule 04.02.2010    source источник
comment
Создайте UIView, который содержит изображение, а также все другие подпредставления, и в методе viewForZoomingInScrollView верните это родительское представление. Все подвиды будут масштабироваться при масштабировании, не проверяли, насколько хорошо это работает с текстом и сложными представлениями, просто попробовали с прямоугольниками.   -  person Alex Gosselin    schedule 17.08.2010


Ответы (3)


В> = 3.2 теперь есть: - (void) scrollViewDidZoom: (UIScrollView *) scrollView

Так что когда-нибудь в будущем это будет разумное решение этой проблемы.

person mclin    schedule 19.05.2010

imageView, который вы возвращаете из viewForZoomingInScrollView:, будет изменяться по мере увеличения изображения. Вы можете реализовать setFrame: или более стандартный layoutSubviews в этом представлении, чтобы выполнить обновление. contentSize представления прокрутки также постоянно обновляется во время масштабирования, поэтому вы можете реализовать setContentSize: в настраиваемом представлении прокрутки.

person drawnonward    schedule 19.05.2010

Я не знаю правильного способа реализовать это, но у меня есть для вас временное решение:

Поскольку viewForZoomingInScrollView вызывается прямо перед масштабированием, а scrollViewDidEndZooming - сразу после, вы можете использовать viewForZoomingInScrollView для вызова метода в отдельном потоке. Этот метод будет проверять zoomScale ваших UIScrollView каждые 100 миллисекунд (или любой другой период, который будет хорошо выглядеть) и внесет все необходимые изменения. В scrollViewDidEndZooming вы остановите выполнение нового метода.

person Michael Kessler    schedule 04.02.2010
comment
Я пробовал это с помощью NSTimer вместо потока, который, как мне кажется, дает то же самое. Однако производительность в симуляторе действительно плохая, что еще больше ухудшает впечатления. Думаю, я просто попробую скрыть подвиды, чтобы увидеть, лучше ли это. Возможно, мне нужно переосмыслить то, как я проектирую подпредставления, и, возможно, просто создать единое представление, которое обрабатывает весь рендеринг и обнаружение событий касания. - person Mike; 05.02.2010