Эффект параллакса с прокруткой - PullRequest
0 голосов
/ 13 декабря 2018

Я сделал программу из одного канала YouTube и столкнулся с проблемой.Я думаю, что это связано с макетом.На разных устройствах отображаются по разному.И может кто-нибудь сказать мне, как исправить, какой текст поместится на другой и как заставить изображение отображаться на всем моем CustomView.

import UIKit struct scrollViewDataStruct {
let title: String?
let image: UIImage?
} class ScrollController: UIViewController, UIScrollViewDelegate{

@IBOutlet weak var scrollView: UIScrollView!

var scrollViewData = [scrollViewDataStruct]()

var viewTagValue = 10
var tagValue = 100

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView.delegate = self

    scrollViewData = [scrollViewDataStruct.init(title: "There was written a very large line that climbs to another line", image: #imageLiteral(resourceName: "knowledge_graph_logo")),
                      scrollViewDataStruct.init(title: "Second", image: #imageLiteral(resourceName: "knowledge_graph_logo"))]

    scrollView.contentSize.width = self.scrollView.frame.width * CGFloat(scrollViewData.count)

    var i = 0

    for data in scrollViewData {
        let view = CustomView(frame: CGRect(x: 10 + (self.scrollView.frame.width * CGFloat(i)), y: 200, width: self.scrollView.frame.width - 75, height: self.scrollView.frame.height - 90))
        view.imageView.image = data.image
        view.tag = i + viewTagValue
        self.scrollView.addSubview(view)

        let label = UILabel(frame: CGRect.init(origin: CGPoint.init(x: 0, y: 20), size: CGSize.init(width: 0, height: 40)))
        label.text = data.title
        label.font = UIFont.boldSystemFont(ofSize: 30)
        label.textColor = UIColor.black
        label.sizeToFit()
        label.tag = i + tagValue

        if i == 0 {
            label.center.x = view.center.x
        } else {
            label.center.x = view.center.x - self.scrollView.frame.width / 2
        }
        self.scrollView.addSubview(label)

        i += 1
    }
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView == scrollView {
        for i in 0..<scrollViewData.count {
            let label = scrollView.viewWithTag(i + tagValue) as! UILabel
            let view = scrollView.viewWithTag(i + viewTagValue) as! CustomView

            var scrollContentOffset = scrollView.contentOffset.x + self.scrollView.frame.width
            var viewOffset = (view.center.x - scrollView.bounds.width / 4) - scrollContentOffset
            label.center.x = scrollContentOffset - ((scrollView.bounds.width / 4 - viewOffset) / 2)
        }
    }
}}class CustomView: UIView {

let imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.backgroundColor = UIColor.darkGray
    imageView.contentMode = .scaleAspectFit
    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")
}}

Это запуск на iPhone 5s

This is a launch on iPhone 5s

Это запуск на iPhone 8 плюс

This is a launch on iPhone 8 plus

1 Ответ

0 голосов
/ 13 декабря 2018

Что вам нужно сделать, это установить ширину каждой метки UILabel в соответствии с размером CustomView, содержащего изображение, и установить для «numberOfLines» каждой метки значение 0 и установить для lineBreak значение wordWrap.Теоретически это должно позволить меткам быть только шириной изображений И позволить меткам UILabels соответствовать размеру текста по вертикали, а не по горизонтали - что и делает sizeToFit.

...