1

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

-UIScrollView
    -UIImageView

就是这样。scrollview 和 imageview 在 Storyboard 中生成。现在我想要做的就是能够缩放到这个图像。最小缩放设置为 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

我究竟做错了什么?

也许我太困了

4

4 回答 4

3

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

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

而且我正在使用 ARC,所以它似乎是多余的,但它确实解决了这个问题。我怀疑这是问题的原因:

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

UIScrollView.h文件

于 2014-02-24T14:24:19.667 回答
2

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

将其分配为全局 _strong 变量MainViewController,一切都已修复。

于 2012-06-07T14:36:07.390 回答
0

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

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

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

于 2012-06-06T16:08:39.620 回答
0

您需要计算出滚动视图的最小缩放比例。缩放比例为 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

于 2014-11-20T17:03:57.340 回答