2014-09-19 2 views
7

Моя задача - скопировать поведение многих приложений, в которых используются фотографии, где отображается UIScrollView с изображением UIImageView внутри, оно соответствует изображению на размер экрана, даже если это изображение меньше.Настройка масштаба масштабирования UIScrollView для соответствия экрану

Я уверен, что это не должно быть сделано с UIImageView кадрами, но с помощью UIScrollView, но как ...?


В моем коде у меня есть метод, называемый updateZoom, который вычисляет значение minimumZoomScale, а также присваивает это значение в zoomScale собственности. Я предполагаю, что это подходящее место для вычисления математики и вычисления zoomScale вручную.

Это метод:

- (void)updateZoom { 
    float minZoom = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (minZoom > 1) { 
     minZoom = 1; 
    } 

    self.scrollView.minimumZoomScale = minZoom; 
    self.scrollView.zoomScale = minZoom; 
} 

Я надеюсь, что кто-то даст мне удар по , как установить zoomScale, чтобы соответствовать UIScrollView границ.

ответ

2

Чтобы установить масштаб, который соответствует размер изображения в Scrollview установить в minimumZoom для Scrollview с помощью этого: self.scrollView.minimumZoomScale = self.scrollView.frame.size.width/ self.imageView.frame.size.width;

Приведенный выше код будет соответствовать изображение в Scrollview Ширина.

5

Решение было довольно легко ... Проверьте этот код (модифицированная версия метода с OP):

- (void)updateZoom { 
    float zoomScale = MIN(self.view.bounds.size.width/self.imageView.image.size.width, self.view.bounds.size.height/self.imageView.image.size.height); 

    if (zoomScale > 1) { 
     self.scrollView.minimumZoomScale = 1; 
    } 

    self.scrollView.minimumZoomScale = zoomScale; 
    self.scrollView.zoomScale = zoomScale; 
} 

Я думаю, что нет ничего, чтобы объяснить, как код прямо вперед.

10

Решения выше работают, но я изо всех сил пытался понять, почему. Я хотел бы поделиться этими двумя статьями, которые я нашел очень полезными при правильном настройке mininumZoomScale и использовании этого для работы с iOS8/XCode 6.

Сначала, чтобы получить представление прокрутки для работы на iOS8, необходимо установить правильные ограничения от начала. Другие плакаты рекомендовали, и я согласен, что в вашем представлении прокрутки должен быть только один просмотр содержимого. Прекрасно вставлять все ваши другие представления в одно представление контента, но вы не хотите устанавливать ограничения вида прокрутки на кучу небольших представлений.

Подключите верхние, ведущие, обратные и нижние ограничения к просмотру прокрутки из представления содержимого (в моем случае это UIImageView) с константой 0. Это задает края вашего представления содержимого в виде прокрутки.

Затем установите размер представления содержимого с использованием ограничений равной ширины и равномерной высоты для представления прокрутки. Вы не можете использовать фиксированную ширину и фиксированную высоту в представлении содержимого, поскольку масштабирование не будет работать, и вы не сможете самостоятельно управлять размером. Без этих ограничений iOS8 устанавливает размер (0,0), прежде чем у вас появится шанс, приводящий к некоторым нечетным артефактам. С помощью этих ограничений вызовите метод updateZoom в методе ориентации, и вы добры. В iOS7 вызовите его в didRotateFromInterfaceOrientation. В iOS8 вызовите его из viewWillTransitionToSize. Вам нужно будет обновить код для перехода в новый размер.

Огромное спасибо Наташе Робот для решения ограничения: http://natashatherobot.com/ios-autolayout-scrollview/

При вызове метода updateZoom, чтобы подправить свой минимум, вы должны также проверить, является ли текущий zoomScale < ваш minimumZoomScale и сбросить его, если он. Вы не должны перезагружать zoomScale в противном случае, поскольку это становится еще одним подозрительным взглядом вашего пользователя при изменении ориентации.

Что касается остальной части этого и почему математические работы, Джо Конвей в objc.io положил все это в этой фантастической статье на границах против кадра с UIScrollViews: http://www.objc.io/issue-3/scroll-view.html

Благодаря обоим и плаката выше ,

-(void)updateZoom { 
    self.scrollView.minimumZoomScale = MIN(self.scrollView.bounds.size.width/self.imageView.image.size.width, self.scrollView.bounds.size.height/self.imageView.image.size.height); 

    if (self.scrollView.zoomScale < self.scrollView.minimumZoomScale) 
     self.scrollView.zoomScale = self.scrollView.minimumZoomScale; 
} 
0

А вот версия Swift 3

var minZoom = min(self.view.bounds.size.width/theImage!.size.width, self.view.bounds.size.height/theImage!.size.height); 

     if (minZoom > 1.0) { 
      minZoom = 1.0; 
     } 

     self.scrollImg.minimumZoomScale = minZoom; 
     self.scrollImg.zoomScale = minZoom; 
1

СВИФТ 3

Благодаря @chewy это работало для меня (мне нужно было добавить "границы" к изображению):

func setZoomScale() { 

    var minZoom = min(self.view.bounds.size.width/imageView!.bounds.size.width, self.view.bounds.size.height/imageView!.bounds.size.height); 

    if (minZoom > 1.0) { 
     minZoom = 1.0; 
    } 

    scrollView.minimumZoomScale = minZoom; 
    scrollView.zoomScale = minZoom; 

} 

Затем вызов setZoomScale() в "переопределить func viewWil lLayoutSubviews() "

Смежные вопросы