1

Этот вопрос заставлял меня гать в течение последних нескольких часов. Таким образом, у меня очень простая настройка UIScrollView:Weird crash while pching UIScrollView

-UIScrollView 
    -UIImageView 

Всё. Прокрутка и просмотр изображений создаются в Storyboard. Теперь все, что я хочу сделать, это иметь возможность зажимать изображение в этом изображении. Минимальный масштаб установлен в 1, и максимальное увеличение равно 3. делегируют Scrollview установлен в моей RootViewController

В моей RootViewController, я добавил эту функцию (требуется для поддержки масштабирования)

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

Я считаю, я я сделал все правильно, но всякий раз, когда я зажимаю scrollview, я получаю отличный EXE_BAD_ACCESS. Я пытался повсюду искать, и я не могу найти проблему. Сбой сброса прилагается ниже

0 libobjc.A.dylib     0x34b80f7e objc_msgSend + 22 
1 UIKit       0x3516899e -[UIScrollView _getDelegateZoomView] + 70 
2 UIKit       0x351908f2 -[UIScrollView _zoomScaleFromPresentationLayer:] + 22 
3 UIKit       0x3523bf5a -[UIScrollViewPinchGestureRecognizer touchesBegan:withEvent:] + 102 
4 UIKit       0x35102436 -[UIWindow _sendGesturesForEvent:] + 278 
5 UIKit       0x351021ee -[UIWindow sendEvent:] + 82 
6 UIKit       0x350e868e -[UIApplication sendEvent:] + 350 
7 UIKit       0x350e7f34 _UIApplicationHandleEvent + 5820 
8 GraphicsServices    0x32c85224 PurpleEventCallback + 876 

Что я делаю неправильно?

Может быть, я слишком сонным

+0

Что вы видите, если вы используете 'NSLog (@"% @ ", _theImageView);' перед возвращением? –

+0

Это смешно, это не имеет значения. Я попытался добавить точку останова к функции viewForZoomingInScrollView:, но она вообще не ломается. Перед этим происходит сбой. –

+0

Как насчет работы с инструментами, установленными для обнаружения зомби? –

ответ

1

Итак, я решил это на следующее утро, посмотрев код с свежая пара глаз. У меня есть инициализация MainViewController и добавлено RootViewController к ее подзону. Проблема заключалась в том, что это была простая ссылка, и ARC отказывалась от нее.

Назначено это как глобальная переменная _strong на MainViewController, и все было исправлено.

+0

Возможно, вы захотите «проголосовать» за ответ ... ваша репутация stackoverflow будет вам благодарна ;-) – tobinjim

+0

«Вы не можете голосовать за ваши собственные сообщения» –

+3

Да, но не можете ли вы принять свой собственный ответ? – tobinjim

0

Что такое _theView? Если это ваша UIScrollView, то вам нужно сделать, это:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return [_theView viewForZoomingInScrollView:scrollView]; 
} 

Кроме того, вам не обязательно это нужно вообще. Пинч-масштабирование должно работать автоматически, если вы явно не задали делегат прокрутки; если вы это сделаете, то в iOS 5 все равно будет работать автоматическое масштабирование, поэтому вам нужно будет только выполнить viewForZoomingInScrollView:, чтобы это работало в iOS 4.

+0

Это была опечатка. Я исправил это сейчас. Это относится к _imageView, который я хочу увеличить. Но когда я устанавливаю там точку останова, эта функция вообще не называется. Перед этим происходит сбой. –

+0

Вам нужно установить свойство делегирования вашего прокрутки в self - иначе эти методы никогда не будут вызываться. – MusiGenesis

+0

Делегат scrollview уже настроен на RootViewController через раскадровку. Я просто протестировал приложение с & без связи делегата, произошел такой же сбой. –

3

Если бы подобный вопрос, решить ее, добавив следующее в dealloc контроллера вида:

self.scrollView.delegate = nil; 
self.scrollView = nil; 

И я использую ARC, так это кажется излишним, но это, безусловно, решает эту проблему. Я подозреваю, что это является причиной выпуска:

@property(nonatomic,assign) id<UIScrollViewDelegate>  delegate;      // default nil. weak reference 

Из UIScrollView.h файла

+0

вы должны использовать слабое ключевое слово вместо назначения в объявлении свойства при использовании ARC – MrTJ

+3

вы имеете в виду Apple должно –

+0

Удивительное и сложное решение! Сэкономил мне много времени, спасибо! ;) Btw: вам не нужно устанавливать 'scrollView' сам в nil, потому что для этого объекта ARC выполняет свою работу ... – Mischa

1

Вы должны отработать минимальный масштаб увеличения для вида прокрутки. Масштаб масштаба означает, что содержимое отображается в нормальном размере. Шкала масштабирования ниже единицы показывает, что контент уменьшен, а масштаб масштабирования больше одного показывает, что контент увеличен. Чтобы получить минимальную масштабную шкалу, вы подсчитываете, как далеко вы должны будете уменьшить масштаб, чтобы изображение плотно прилегало к ваши рамки просмотра прокрутки основаны на его ширине. Затем вы делаете то же самое на основе высоты изображения. Минимум этих двух результирующих масштабных масштабов будет минимальной шкалой масштабирования прокрутки. Это дает вам масштаб масштаба, где вы можете увидеть все изображение, когда оно полностью уменьшено.

Swift:

let scrollViewFrame = scrollView.frame 
let scaleWidth = scrollViewFrame.size.width/scrollView.contentSize.width 
let scaleHeight = scrollViewFrame.size.height/scrollView.contentSize.height 
let minScale = min(scaleWidth, scaleHeight); 
scrollView.minimumZoomScale = minScale; 

Objective-C

CGFloat scrollViewFrame = scrollView.frame 
CGFloat scaleWidth = scrollViewFrame.size.width/scrollView.contentSize.width 
CGFloat scaleHeight = scrollViewFrame.size.height/scrollView.contentSize.height 
CGFloat minScale = min(scaleWidth, scaleHeight); 
scrollView.minimumZoomScale = minScale; 

Из других проектов и личного опыта делают тяжелую GPU на прошивкой (бесконечный свиток, максимальный размер растрового изображения, и т.д.), я заметил, что каждое устройство имеет собственный порог. Для прошлых проектов, я также жёстко ниже значения как minimumZoomScale для предотвращения аварий:

scale : 
     { 
       iPad : { 
        min : 0.8 
       , max : 1.6 
      } 
      , iPhone : { 
        min : 0.25 
       , max : 1.6 
      } 
      , iPhone6 : { 
        min : 0.3333 
       , max : 1.6 
      } 
      , iPhoneResizable: { 
        min : 1 
       , max : 1.6 
      } 
     } 

Большой учебник для начинающих: http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

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

  • Нет связанных вопросов^_^