滚动视图中的图像自动布局swift 4

时间:2018-10-09 15:26:33

标签: ios swift xcode

我以编程方式将图像放入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")
}

}

2 个答案:

答案 0 :(得分:0)

iPhone 8的屏幕尺寸为1334x750,比率为667:375。

iPhone 8 Plus的屏幕尺寸为1920×1080,比率为16:9。

是的,图像将无法完美显示。因此,放大UIScrollView应该可以像这样工作:

view.zoom(to: CGRect(x: 0, y:0, width: UIScreen.main.nativeBounds.width, height: UIScreen.main.nativeBounds.height, animated: false)

答案 1 :(得分:0)

在没有看到您的代码的情况下很难说出问题是什么,但我只是注意到您说过:

  

我将代码放在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)viewDidLoad中添加viewDidAppear调用,看看大小是否保持不变。

因此,请尝试将添加内容的代码移至scrollView的{​​{1}}上。

希望有帮助。