首页 > 解决方案 > 滚动视图自动布局中的图像 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")
}

}

标签: iosswiftxcode

解决方案


如果没有看到您的代码,很难说出问题可能是什么,但我只是注意到您说:

我把代码放在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))

正如我上面写的,你不能确定你的尺寸scrollViewviewDidLoad. 尝试添加print(scrollView.frame)调用viewDidLoadviewDidAppear看看大小是否没有变化。

因此,请尝试将您添加内容的代码移动到您scrollView的位置viewWillAppear

希望有帮助。


推荐阅读