1

這個問題一直驅使我在過去幾個小時的堅果。所以我有一個非常簡單的UIScrollView設置:奇怪的崩潰,同時捏UIScrollView

-UIScrollView 
    -UIImageView 

就是這樣。 Storyboard中生成scrollview和imageview。現在我想要做的就是有能力縮放這張圖片。最小縮放設置爲1和最大變焦爲3滾動視圖的委託設置爲我的RootViewController的

在我的RootViewController的,我已經加入這個功能(需要支持縮放)

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

我相信我」我做了一切正確的,但每當我捏的滾動視圖,我得到了偉大的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正在將其解除分配。

將其指定爲MainViewController上的全局_strong變量,並且所有變量都已修復。

+0

你可能想「投票」的答案...你的計算器信譽將會感謝你;-) – 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的委託已經通過storyboard設置爲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

你的意思是蘋果應該 –

+0

真棒和棘手的解決方案!爲我節省了很多時間,謝謝! ;)btw:你不需要將scrollView'本身設置爲nil,因爲對象ARC正在完成它的工作... – Mischa

1

你需要制定出最低縮放比例滾動視圖。縮放比例爲1意味着內容以正常大小顯示。小於1的縮放比例顯示縮小的內容,而大於1的縮放比例顯示放大的內容。要獲得最小的縮放比例,您需要計算需要縮小的距離,以便圖像可以貼合地放入您的滾動視圖的邊界基於其寬度。然後,根據圖像的高度進行相同的操作。這兩個縮放比例的最小值將是滾動視圖的最小縮放比例。這給你一個縮放比例,你可以在完全縮小時看到整個圖像。

斯威夫特:

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; 

從其他項目和個人經驗做在iOS重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