设置UIScrollView缩放比例以适合屏幕

coj*_*joj 9 iphone objective-c uiscrollview uiimageview ios

我的观点是复制使用照片的许多应用程序的行为,其中当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;
}
Run Code Online (Sandbox Code Playgroud)

我希望有人会给我一个关于如何设置以适应界限的打击.zoomScaleUIScrollView

Dan*_*ney 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是否为<your 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;
}
Run Code Online (Sandbox Code Playgroud)


coj*_*joj 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;
}
Run Code Online (Sandbox Code Playgroud)

我认为没有什么可以解释的,因为代码是直截了当的.


Aks*_*Aks 3

要设置适合scrollView中图像大小的缩放,请使用以下命令设置scrollView的minimumZoom: self.scrollView.minimumZoomScale = self.scrollView.frame.size.width/ self.imageView.frame.size.width;

上面的代码将使您的图像适合滚动视图的宽度。