ios - 滚动视图自动布局中的图像 swift 4
问题描述
UIScrollview
我以编程方式将图像放入。当我在 iPhone 8 上运行模拟器时,每个图像的宽度都非常适合屏幕。但是,当我在 iPhone 8 Plus 上运行它时,图像的宽度比屏幕的宽度要短。我认为自动布局有问题。这背后的可能原因是什么?我将以下代码放入ViewDidLoad
.
scrollViewData = [scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 1")), scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 2")), scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 3")), scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 4")), scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 5")), scrollViewDataStruct.init(title: nil, image: #imageLiteral(resourceName: "promotion test 6"))]
scrollView.contentSize.width = self.scrollView.frame.width * CGFloat(scrollViewData.count)
var i = 0
for data in scrollViewData {
let view = CustomView(frame: CGRect(x: self.scrollView.frame.width * CGFloat(i), y: 0, width: self.scrollView.frame.width, height: self.scrollView.frame.height))
view.imageView.image = data.image
self.scrollView.addSubview(view)
i += 1
我把下面的代码分开
class CustomView: UIView {
let imageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.backgroundColor = UIColor.clear
imageView.contentMode = .scaleToFill
return imageView
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(imageView)
imageView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
imageView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
}
required init?(coder aDecoder: NSCoder){
fatalError("init(coder:) has not been implemented")
}
}
解决方案
如果没有看到您的代码,很难说出问题可能是什么,但我只是注意到您说:
我把代码放在
ViewDidLoad
.
一个问题可能是,在viewDidLoad
生命周期中调用时,您不能依赖您看到的视图尺寸。
如果你想看到这个“在行动”,你可以尝试添加:
print(view.frame)
至
viewDidLoad()
viewWillAppear(_:)
viewDidAppear(_:)
viewDidLayoutSubviews()
并看到随着您在整个生命周期中的进展,价值观正在发生变化。
是的,这不是一个真正的答案,而只是您在设置视图层次结构时应该注意的事情。
编辑,更新代码后
所以你已经在你的问题中添加了一些代码,谢谢:)
我偶然发现了这条线:
let view = CustomView(frame: CGRect(x: self.scrollView.frame.width * CGFloat(i), y: 0, width: self.scrollView.frame.width, height: self.scrollView.frame.height))
正如我上面写的,你不能确定你的尺寸scrollView
在viewDidLoad
. 尝试添加print(scrollView.frame)
调用viewDidLoad
,viewDidAppear
看看大小是否没有变化。
因此,请尝试将您添加内容的代码移动到您scrollView
的位置viewWillAppear
。
希望有帮助。
推荐阅读
- arrays - 为什么这会返回-nan?
- c++ - 在同一段代码中获取临时地址 - 总是安全的?
- javascript - 在 iframe 中加载动态链接
- wordpress - 简码函数 Wordpress 中的异步延迟 Javascript
- iframe - Google Analytics iframe onclick 事件(页面浏览量反映,但跟踪事件不反映实时)
- python - 您可以将一个具有固定单词列表的文件与一个在 python 中每 10 秒更新一次单词的文件进行比较吗?
- python-3.x - 如何为 BERT 准备文本 - 出现错误
- angular - 带有 jest-angular-preset 和 Storybook 的破碎 Storyshots(找不到 setupJest 模块)
- flutter - 在 Vscode 中将 Dart SDK 从 2.10.3 更新到 2.12.0
- spring-webflux - 一个标准完整的 REST 操作如何使用 Spring WebClient