过去几个小时,这个问题让我疯狂。所以我有一个非常简单的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
我做错了什么?
也许我太困了
答案 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中工作。