捏UIScrollView时发生奇怪的崩溃

时间:2012-06-06 15:59:22

标签: objective-c ios uiscrollview uigesturerecognizer uipinchgesturerecognizer

过去几个小时,这个问题让我疯狂。所以我有一个非常简单的UIScrollView设置:

-UIScrollView
    -UIImageView

就是这样。 scrollview和imageview在Storyboard中生成。现在,我想做的就是能够将变焦捏合到这个图像中。最小缩放设置为1,最大缩放设置为3. scrollview的委托设置为我的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

我做错了什么?

也许我太困了

4 个答案:

答案 0 :(得分:3)

有类似的问题,通过在视图控制器的dealloc中添加以下内容来解决它:

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

我正在使用ARC,因此它看似多余,但它肯定解决了这个问题。 我怀疑这是问题的原因:

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

来自UIScrollView.h档案

答案 1 :(得分:1)

所以我在第二天早上用一双新眼睛看完代码后解决了这个问题。我有一个MainViewController初始化,并在其子视图中添加了RootViewController。问题是,这是一个_weak参考,ARC正在解除它。

将其指定为MainViewController上的全局_strong变量,并且所有变量都已修复。

答案 2 :(得分: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;

目标-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

答案 3 :(得分:0)

什么是_theView?如果是你的UIScrollView,那么你需要这样做:

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

此外,您根本不需要这个。除非您明确设置滚动视图的委托,否则缩放缩放应该自动工作;如果你这样做,捏缩放仍然应该在iOS 5中自动工作,所以你只需要实现viewForZoomingInScrollView:就可以在iOS 4中工作。