以编程方式更改 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)的主要内容,如果未能解决你的问题,请参考以下文章