UIScrollView не масштабируется

У меня проблема с функцией масштабирования UIScrollView. Совсем не работает. Я читал похожие сообщения, и ни одно из исправлений, которые использовали другие, не помогло мне. Мой viewController ссылается на UIScrollViewDelegate, у меня есть переменная экземпляра для UIScrollView, я объявляю свое подпредставление объектом-делегатом UIScrollView, и у меня есть реализация для (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView. Вот моя функция loadView:

(void)loadView 
{
    CGRect frame = CGRectMake(0, 0, 320, 480);

    scrollView = [[UIScrollView alloc] initWithFrame:frame];
    [scrollView setScrollEnabled:YES];

    CGRect reallyBigRect;
    reallyBigRect.origin = CGPointZero;
    reallyBigRect.size.width = frame.size.width * 2.0;
    reallyBigRect.size.height = frame.size.height * 2.0;
    [scrollView setContentSize:reallyBigRect.size];

    CGPoint offset;
    offset.x = frame.size.width * 0.5;
    offset.y = frame.size.height * 0.5;
    [scrollView setContentOffset:offset];


    [scrollView setMinimumZoomScale:1];
    [scrollView setMaximumZoomScale:5];
    [scrollView setUserInteractionEnabled:YES];
    self.scrollView.delegate = self;


    self.view = scrollView;

    views = [[HypnosisView alloc] initWithFrame:reallyBigRect];

    [scrollView addSubview:views];

    [self.view setBackgroundColor:[UIColor clearColor]]; 

}

Этот код позволяет мне просто прокручивать, но масштабирования нет.

Надеюсь получить известие от кого-нибудь, Дэйв


person davetw12    schedule 21.07.2012    source источник
comment
по какой причине вы не добавляете scrollview в self.view?   -  person tiguero    schedule 22.07.2012
comment
К вашему сведению, я не подписываю ваше сообщение: stackoverflow.com/faq#signatures   -  person tiguero    schedule 22.07.2012
comment
Ой ну спасибо! Я не знал, что мои сообщения подписывались автоматически. Ну, в первый раз я попытался добавить scrollview через (addubview) в self.view, это привело бы к сбою приложения. С self.view = scrollview он работает нормально. Я предполагаю, что это потому, что в этом месте кода нет представления, в которое можно было бы добавить scrollview.   -  person davetw12    schedule 22.07.2012


Ответы (3)


Вы пробовали реализовать scrollViewDidEndZooming:withView:atScale:?


Из документации Apple по UIScrollView:

Просмотр прокрутки также обрабатывает масштабирование и панорамирование содержимого. Когда пользователь делает жест сжатия или разводки, вид прокрутки регулирует смещение и масштаб содержимого. Когда жест завершается, объект, управляющий представлением содержимого, должен при необходимости обновлять подпредставления содержимого. (Обратите внимание, что жест может закончиться, и палец все еще может быть опущен.) Пока жест выполняется, представление прокрутки не отправляет никаких вызовов отслеживания в подпредставление.

Класс UIScrollView может иметь делегата, который должен использовать протокол UIScrollViewDelegate. Для работы масштабирования и панорамирования делегат должен реализовать как viewForZoomingInScrollView:, так и scrollViewDidEndZooming: withView: atScale:; кроме того, максимальный (maximumZoomScale) и минимальный (minimumZoomScale) масштаб масштабирования должны отличаться.

person Pedro Cattori    schedule 22.07.2012
comment
Я реализовал их оба, Педро. У меня есть минимальный и максимальный масштаб масштабирования, установленный для моего объекта делегата на 1.0 и 4.0 соответственно. - person davetw12; 22.07.2012
comment
Я восстанавливаю здесь давно законченную тему, но, Педро, не могли бы вы указать, как реализовать scrollViewDidEndZooming: withView: atScale:? Например. скажем, внутри прокрутки есть только один UIImageView, как его масштабировать? - person Mirror318; 07.04.2013
comment
Давно не делал iOS, и я точно не помню. Однако есть несколько хороших видеолекций, предлагаемых бесплатно через iTunes. Они предоставляются Стэнфордом под названием «Разработка приложений для iOS». Я помню, как в какой-то момент профессор подробно рассказывал об этом. Извини, я больше ничем не мог помочь прямо сейчас! - person Pedro Cattori; 18.04.2013

Для включения масштабирования необходимо сделать две вещи:

  1. Используйте протокол UIScrollViewDelegate и реализуйте viewForZoomingInScrollView:UIScrollView -> UIView?. Установите делегат полосы прокрутки как реализующий класс. Ожидается, что возврат UIView будет увеличен. Итак, простой пример:

    
    @IBOutlet var myZoomableImageView: UIImageView?`
    
    override func viewDidLoad() {
        myScrollView?.delegate = self
    } 
    
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return myZoomableImageView
    }
    
  2. Установите максимальное и минимальное масштабирование для просмотра прокрутки, используя UIScrollView.minimumZoomScale и UIScrollView.maximumZoomScale, например:

    
    myScrollView?.minimumZoomScale = 1.0
    myScrollView?.maximumZoomScale = 3.0 
    
    `

person Rem-D    schedule 04.02.2016

В этом сообщении освещаются три вещи, необходимые для включения масштабирования:

  1. Вам нужен делегат, который реализует UIScrollViewDelegate и установлен на delegate в вашем UIScrollView экземпляре
  2. В своем делегате вы должны реализовать один метод: viewForZoomingInScrollView: (который должен возвращать представление содержимого, которое вы хотите масштабировать). Вы также можете дополнительно реализовать scrollViewDidEndZooming:withView:atScale:.
  3. В вашем экземпляре UIScrollView вы должны установить разные minimumZoomScale и maximumZoomScale (по умолчанию они равны 1.0).

Из вашего примера кода мы видим, что №1 и №3 реализованы. Следовательно, вполне вероятно, что проблема №2. Дважды проверьте код для реализации метода viewForZoomingInScrollView или, в идеале, включите его в приведенный выше код.

person Senseful    schedule 15.02.2020