以编程方式更改 UIScrollView 的框架(Swift 5)

Posted

技术标签:

【中文标题】以编程方式更改 UIScrollView 的框架(Swift 5)【英文标题】:Change UIScrollView's frame programatically (Swift 5) 【发布时间】:2020-07-20 08:23:34 【问题描述】:

如何以编程方式根据子视图的大小更改框架的高度?

scrollView.frame = CGRect(origin: scrollView.frame.origin, size: CGSize(width: scrollView.frame.width, height: scrollView.frame.height))

这是我为更改框架高度而编写的代码,但是即使我将高度设置为 1000,框架也不会改变。此外,我还尝试设置 scollView.contentSize 的高度。它只允许子视图能够在 scrollView 内滚动,并且不会改变高度。

这就是我编写代码的方式: Image

结果: Image

要显示的全图:Image

【问题讨论】:

您是否使用自动布局,这会阻止您更改框架?你如何设置滚动视图(frame 和 contentSize)? 是的,我使用的是自动布局。我拖动滚动视图,使其与屏幕宽度匹配并将高度设置为特定值(例如 200)。此外,我建立了对超视图的前导、顶部、尾随和底部的约束,值为 0。当然,我会收到一个错误,因为我没有设置内容大小,而且我不知道内容的大小(例如图像) 这将是。我将框架大小(仅高度)设置为与图像的 intrinsicContentSize 相似,并将内容大小设置为与框架具有相同的宽度和高度。 那么,您到底想实现什么?通常,您不会更改滚动视图的框架,而是修改 contentSize。请写你想要的,因为修改框架应该可以随时工作(除了自动布局;在这种情况下,你需要修改顶部和/或底部约束) 基本上我希望滚动视图用作图像滑块。我希望图像完全显示在屏幕上,并将 contentMode 设置为 Aspect Fill。因此,滚动视图的高度将与要加载的图像的高度相似。对于宽度,它将基于我已经放大以匹配屏幕的滚动视图的大小。此外,滚动视图下还有一个长段落(文本视图),顶部约束为滚动视图,底部约束为安全视图。是不是因为这种限制而阻止框架不改变大小? 因此,假设您的屏幕高度为 1000,滚动视图高度为 600,文本视图高度为 400。您要显示的图像高度为 2000,您显示的文本高度也为 2000 (确实是长文本)——你想要什么样的布局?为什么要更改滚动视图的高度?通常,高度保持不变,因此您只能看到图像 2000 像素(或任何单位)中的 600 个,如果您想查看其余部分,则必须滚动。文本相同,宽度相同。这是你想要的吗? 【参考方案1】:

首先,请不要发布您的代码图片,请发布代码本身。这有助于复制/粘贴部分内容,以便了解您的问题。

在您的特殊情况下,只有一些小问题:

第 21 行(没有代码,因为只有图像):这个语句是完全多余的。您将滚动视图的框架设置为滚动视图的框架。你可以跳过这个。

第 23 行:将图像视图的大小设置为滚动视图的大小。您真正想要的是图像的大小,因为您希望能够看到完整的图像(通过滚动,如果它太大)

缺失:你还需要设置滚动视图的内容大小,让它知道它的内部内容有多大(例如,确定它应该支持多少水平和垂直滚动)

因此:

override func viewDidLoad() 
    super.viewDidLoad()
    
    guard let img = UIImage(named: "komtar") else  return 
    
    let imgViewFrame = CGRect(origin: CGPoint(x: 0, y: 0), size: img.size)
    let imgView = UIImageView(frame: imgViewFrame)
    imgView.image = img
    scrollView.contentSize = img.size
    scrollView.addSubview(imgView)


更新

如果要修改滚动视图本身的高度,则需要

高度限制 从约束到视图控制器的出口连接 修改约束的value 属性以更改高度

但我认为滚动视图不是最好的方法。 也许你可以检查一下: Swipe back and forth through array of images Swift - 可能有点老,但可能会给你一些提示。

【讨论】:

我已经尝试过你的答案,但它仍然没有使滚动视图放大到图像的相同高度。它只是使滚动视图变得可滚动,我不希望它被滚动。我使用滚动视图的原因是,如果有多个图像(图像滑块),我希望它只水平滑动到下一个/上一个图像。而且,这就是为什么我没有在代码中设置contentSize。很抱歉发布图像而不是复制和粘贴代码。这就是我最后想要的 [link] (imgur.com/a/ZALE129)【参考方案2】:

非常感谢@AndreasOetjen 的提示,我已经解决了我的问题。

我是如何解决的

    为 ScrollView HeightConstraint 创建一个 IBOutlet 连接 将HeightConstraint 常量设置为图像的高度。 scrollViewHeightConstraint.constant = imageView.intrinsicContentSize.height

我认为这是调整 Scroll View 框架大小的唯一方法。

我使用imageView.intrinsicContentSize.height而不是image.size.height的原因是因为我引用了this,这样我就可以保持宽度比并根据图像高度增加/减少高度。

结果

Image

【讨论】:

以上是关于以编程方式更改 UIScrollView 的框架(Swift 5)的主要内容,如果未能解决你的问题,请参考以下文章

更改以编程方式创建的单击 UIButton 的背景图像

更改 UIScrollView 中间按钮的大小

如何更改 UIScrollView 的位置和大小?

以编程方式滑动 UIScrollView

以 uiscrollview 的负面方式添加视图并更改 contentsize

如何以编程方式在 UIScrollview 中创建 UIScrollview