我的观点是复制使用照片的许多应用的行为,其中当UIScrollView
内部带有UIImageView
时,即使此图像较小,它也适合图像尺寸。
我确定不应该使用UIImageView
框架进行此操作,而应由UIScrollView
进行操作但是如何...?
在我的代码中,我有一个名为updateZoom
的方法,它计算minimumZoomScale
值并将该值赋给zoomScale
属性。我想这是进行数学运算并手动计算zoomScale
的正确位置。
这是方法:
- (void)updateZoom {
float minZoom = MIN(self.view.bounds.size.width / self.imageView.image.size.width, self.view.bounds.size.height / self.imageView.image.size.height);
if (minZoom > 1) {
minZoom = 1;
}
self.scrollView.minimumZoomScale = minZoom;
self.scrollView.zoomScale = minZoom;
}
我希望有人能够帮助我如何设置zoomScale
以适应UIScrollView
界限。
答案 0 :(得分:11)
上面的解决方案有效,但我很难理解为什么。我想分享这两篇文章,我发现这些文章非常有用,可以正确设置mininumZoomScale并使其与iOS8 / XCode 6一起使用。
首先,让滚动视图在iOS8上运行需要您从一开始就正确设置约束。其他海报建议,我同意,你的滚动视图应该只有一个内容视图。很好地将所有其他视图嵌入到一个内容视图中,但是您不希望将滚动视图约束设置为一堆小视图。
将Top,Leading,Trailing和Bottom约束连接到内容视图(在我的情况下,它是UIImageView)的滚动视图,常量为0.这会将内容视图的边缘设置为滚动视图。
接下来,使用Equal Width和Equal Height约束将内容视图的大小设置为滚动视图。您无法在内容视图中使用固定宽度和固定高度,因为缩放不起作用,您也无法自行管理大小。如果没有这些约束,iOS8会在您有机会产生一些奇怪的工件之前将大小设置为(0,0)。使用这些约束,在orientation方法中调用updateZoom方法,你很好。在iOS7中,在didRotateFromInterfaceOrientation中调用它。在iOS8中,从viewWillTransitionToSize调用它。您需要更新代码以传递新大小。
非常感谢Natasha The Robot提供的约束解决方案:http://natashatherobot.com/ios-autolayout-scrollview/
当您调用updateZoom方法调整最小值时,还应检查当前的zoomScale是否为<你的minimumZoomScale并重置它,如果是的话。您不应该重置zoomScale,否则当方向发生变化时,这将成为用户的另一种古怪外观。
至于其余部分和数学运算的原因,objc.io的Joe Conway在UIScrollViews的这篇关于边界与框架的精彩文章中全力以赴:http://www.objc.io/issue-3/scroll-view.html
感谢上述两张海报。
-(void)updateZoom {
self.scrollView.minimumZoomScale = MIN(self.scrollView.bounds.size.width / self.imageView.image.size.width, self.scrollView.bounds.size.height / self.imageView.image.size.height);
if (self.scrollView.zoomScale < self.scrollView.minimumZoomScale)
self.scrollView.zoomScale = self.scrollView.minimumZoomScale;
}
答案 1 :(得分:5)
解决方案相当简单......查看此代码(OP的方法修改版):
- (void)updateZoom {
float zoomScale = MIN(self.view.bounds.size.width / self.imageView.image.size.width, self.view.bounds.size.height / self.imageView.image.size.height);
if (zoomScale > 1) {
self.scrollView.minimumZoomScale = 1;
}
self.scrollView.minimumZoomScale = zoomScale;
self.scrollView.zoomScale = zoomScale;
}
我认为没有什么可以解释的,因为代码是直截了当的。
答案 2 :(得分:3)
SWIFT 3
感谢@chewy这对我有用(我需要添加&#34;界限&#34;到图像):
func setZoomScale() {
var minZoom = min(self.view.bounds.size.width / imageView!.bounds.size.width, self.view.bounds.size.height / imageView!.bounds.size.height);
if (minZoom > 1.0) {
minZoom = 1.0;
}
scrollView.minimumZoomScale = minZoom;
scrollView.zoomScale = minZoom;
}
然后在&#34中调用setZoomScale();覆盖func viewWillLayoutSubviews()&#34;
答案 3 :(得分:2)
要在scrollView中设置适合图像大小的缩放,请使用以下命令设置scrollView的minimumZoom:
self.scrollView.minimumZoomScale = self.scrollView.frame.size.width/ self.imageView.frame.size.width;
上面的代码将使您的图像适合scrollView Width。
答案 4 :(得分:1)
这是Swift 3版本
var minZoom = min(self.view.bounds.size.width / theImage!.size.width, self.view.bounds.size.height / theImage!.size.height);
if (minZoom > 1.0) {
minZoom = 1.0;
}
self.scrollImg.minimumZoomScale = minZoom;
self.scrollImg.zoomScale = minZoom;