如何在UIScrollView中使UIImage可滚动?

时间:2019-07-06 08:40:07

标签: ios swift uiscrollview uiimageview uiimage

我目前有一个ScrollView,在ScrollView内部,我有一个UIImageView

我从服务器获得的图像大小不同,并且大多数图像大于屏幕的bounds

如果图像比屏幕大,我想滚动浏览图像。

类似这样的东西...

enter link description here

这是我到目前为止尝试过的。

let image = UIImage(named: "myImg")
let heightInPoints = image?.size.height
let heightInPixels = heightInPoints ?? 0 * image!.scale
let widthInPoints = image?.size.width
let widthInPixels = widthInPoints ?? 0 * image!.scale

self.imageView.frame = CGRect(x: 0, y: 0, width: widthInPixels, height: heightInPixels) //= image
self.imageView.image = image

scrollView.contentSize = CGSize(width: imageView.frame.width, height: imageView.frame.height)

但是它似乎不起作用。它只能垂直或水平滚动,也不能滚动。

我在做什么错。还是有更好的方法来获得这种效果?

1 个答案:

答案 0 :(得分:1)

解决方案1.更新框架

首先,确保正确设置视图层次结构(将imageView添加到scrollView):

scrollView.addSubview(imageView)

然后我建议将这段代码重写为:

let image = UIImage(named: "myImg")
imageView.image = image                        // setup image to imageView
imageView.frame.size = image?.size ?? .zero    // setup image size or zero to imageView
scrollView.contentSize = image.size ?? .zero   // setup image size or zero as a content size

解决方案2。使用约束

还有另一种使用约束而不是手动设置大小的解决方案。这需要花费更多的代码,但是更改图像时不需要重新计算大小。

scrollView.addSubview(imageView)                            // Setup the views hierarchy
imageView.translatesAutoresizingMaskIntoConstraints = false // Make sure constraints won't interfere with autoresizing mask
NSLayoutConstraint.activate(
    [
        imageView.leftAnchor.constraint(equalTo: scrollView.leftAnchor),    // attaching to the left
        imageView.topAnchor.constraint(equalTo: scrollView.topAnchor),      // attaching to the top
        imageView.rightAnchor.constraint(equalTo: scrollView.rightAnchor),  // attaching to the right
        imageView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor) // attaching to the bottom
    ]
)

然后我们将现有图像替换为新图像,如下所示:

imageView.image = UIImage(named: "myImg") 

这两种方法都可以在Playground中为我工作。因此,如果这些仍然不适合您,请分享有关如何设置滚动视图的层次结构和其他参数的更多信息。