UIScrollView не отображается в представлении

Я реализую UIScrollView в CollectionViewCell. У меня есть пользовательский вид, который должен отображаться в режиме прокрутки, поэтому я выполняю следующую программу в CollectionViewCell. Я создал все программно, и ниже мой код:

struct ShotsCollections {
    let title: String?
}

class ShotsMainView: UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)

        setupViews()

        containerScrollView.contentSize.width = frame.width * CGFloat(shotsData.count)

        shotsData = [ShotsCollections.init(title: "squad"), ShotsCollections.init(title: "genral")]
        var i = 0
        for data in shotsData {

            let customview = ShotsMediaView(frame: CGRect(x: containerScrollView.frame.width * CGFloat(i), y: 0, width: containerScrollView.frame.width, height: containerScrollView.frame.height))

            containerScrollView.addSubview(customview)
            i += 1
        }

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    var shotsData = [ShotsCollections]()

    var containerScrollView: UIScrollView = {
        let instance = UIScrollView()
        instance.isScrollEnabled = true
        instance.bounces = true
        instance.backgroundColor = blueColor
        return instance
    }()


    private func setupViews() { //These are constraints by using TinyConstraints
        addSubview(containerScrollView)
        containerScrollView.topToSuperview()
        containerScrollView.bottomToSuperview()
        containerScrollView.rightToSuperview()
        containerScrollView.leftToSuperview()
    }
}

Теперь проблема в том, что при отображении прокрутки содержимое в нем отсутствует. При печати contentSize и frame прокрутки отображается 0. Но если я проверю иерархию представления отладки, прокрутка содержит 2 представления с определенными кадрами.

Я не уверен, что происходит не так. Любая помощь приветствуется.

Если на ваш вопрос дан ответ, вы должны закрыть вопрос, приняв ответ.

kerry 22.05.2019 15:12

@kerry Привет, приятель, попробовал твое решение, но, как я уже упоминал, наличие ограничений меня не совсем убедило, а также не тренировалось. Главное было установить рамку скроллвью равной супревью и присвоить данные массива выше размера контента. Это само по себе создаст прокручиваемый контент. Но я обязательно проголосую за всю оперативную помощь, которую вы мне оказали. Ваше здоровье

Aakash Dave 23.05.2019 02:09
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
944
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы добавляете customView в свой containerScrollView, вы не устанавливаете ограничения между customView и containerScrollView.

Добавьте эти ограничения, и вы сможете увидеть свои customView, учитывая, что ваш customView имеет некоторую высоту. Кроме того, при добавлении дополнительного представления вам потребуется удалить нижнее ограничение последнего добавленного представления и создать нижнее ограничение для containerScrollView с последним добавленным представлением.

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

Aakash Dave 22.05.2019 13:40

Постарайтесь понять ответ. Если вы создаете все программно, вам нужно добавлять ограничения тоже программно. NSLayoutConstraints.activate(). Поскольку вы не добавляете ограничения в customView, когда добавляете его, вы не можете его увидеть, и его высота не преобразуется в высоту scrollView.

kerry 22.05.2019 13:41

Черт! Я вижу, что вы говорите, теперь полностью вас понимаю. Мой плохой _фейспалмс_.. Итак, если я прокручиваю горизонтально, я должен заменить левое и правое ограничения, верно?

Aakash Dave 22.05.2019 14:01

да. Если вы добавляете новый вид справа, вам нужно заменить правое ограничение последнего вида и создать цепочку с новым видом. Затем добавьте правое ограничение нового представления справа от суперпредставления, тем самым завершив цепочку.

kerry 22.05.2019 14:04

Итак, в этом случае мне нужно, чтобы мои взгляды были однозначно идентифицированы? Не могли бы вы немного помочь мне с цепочкой?

Aakash Dave 22.05.2019 14:05

Checkout горизонтальное представление стека, предоставляемое iOS. Это поможет вам с цепочкой.

kerry 22.05.2019 14:08

Ну, я знаю об этом. Я не могу понять это на данный момент. Вы предлагаете добавить их в представление стека вообще? Просто пытаюсь четко понять вашу точку зрения

Aakash Dave 22.05.2019 14:10

да. Добавьте представление стека в представлении прокрутки. Затем добавьте свои пользовательские представления в представление стека. Stackview начнет расти, как и ваш вид прокрутки.

kerry 22.05.2019 14:11

Я создал образец приложения для вашего варианта использования. Я вставляю код и полученный снимок экрана ниже. Надеюсь, это та функциональность, которую вы ищете. Я предлагаю вам вставить это в новый проект и настроить код, пока вы не будете удовлетворены. Я добавил комментарии, чтобы было понятно.

ViewController

import UIKit

class ViewController: UIViewController {

    // Initialize dummy data array with numbers 0 to 9
    var data: [Int] = Array(0..<10)

    override func loadView() {
        super.loadView()
        // Add collection view programmatically
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.register(ShotsMainView.self, forCellWithReuseIdentifier: ShotsMainView.identifier)
        self.view.addSubview(collectionView)
        NSLayoutConstraint.activate([
            self.view.topAnchor.constraint(equalTo: collectionView.topAnchor),
            self.view.bottomAnchor.constraint(equalTo: collectionView.bottomAnchor),
            self.view.leadingAnchor.constraint(equalTo: collectionView.leadingAnchor),
            self.view.trailingAnchor.constraint(equalTo: collectionView.trailingAnchor),
        ])
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = UIColor.white
        self.view.addSubview(collectionView)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view.backgroundColor = UIColor.white
    }
 }   

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ShotsMainView.identifier, for: indexPath) as! ShotsMainView
        return cell
    }
}

extension ViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // The cell dimensions are set from here
        return CGSize(width: collectionView.frame.size.width, height: 100.0)
    }
}

ВыстрелыMainView Это ячейка просмотра коллекции

import UIKit

class ShotsMainView: UICollectionViewCell {

    static var identifier = "Cell"
    weak var textLabel: UILabel!

    override init(frame: CGRect) {
        // Initialize with zero frame
        super.init(frame: frame)
        // Add the scrollview and the corresponding constraints
        let containerScrollView = UIScrollView(frame: .zero)
        containerScrollView.isScrollEnabled = true
        containerScrollView.bounces = true
        containerScrollView.backgroundColor = UIColor.blue
        containerScrollView.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(containerScrollView)
        NSLayoutConstraint.activate([
            self.topAnchor.constraint(equalTo: containerScrollView.topAnchor),
            self.bottomAnchor.constraint(equalTo: containerScrollView.bottomAnchor),
            self.leadingAnchor.constraint(equalTo: containerScrollView.leadingAnchor),
            self.trailingAnchor.constraint(equalTo: containerScrollView.trailingAnchor)
        ])

        // Add the stack view that will hold the individual items that
        // in each row that need to be scrolled horrizontally
        let stackView = UIStackView(frame: .zero)
        stackView.distribution = .fill
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .horizontal
        containerScrollView.addSubview(stackView)
        stackView.backgroundColor = UIColor.magenta

        NSLayoutConstraint.activate([
            containerScrollView.leadingAnchor.constraint(equalTo: stackView.leadingAnchor),
            containerScrollView.trailingAnchor.constraint(equalTo: stackView.trailingAnchor),
            containerScrollView.topAnchor.constraint(equalTo: stackView.topAnchor),
            containerScrollView.bottomAnchor.constraint(equalTo: stackView.bottomAnchor)
        ])

        // Add individual items (Labels in this case).
        for i in 0..<10 {
            let label = UILabel(frame: .zero)
            label.translatesAutoresizingMaskIntoConstraints = false
            stackView.addArrangedSubview(label)
            label.text = "\(i)"
            label.font = UIFont(name: "System", size: 20.0)
            label.textColor = UIColor.white
            label.backgroundColor = UIColor.purple
            label.layer.masksToBounds = false
            label.layer.borderColor = UIColor.white.cgColor
            label.layer.borderWidth = 1.0
            label.textAlignment = .center


            NSLayoutConstraint.activate([
                label.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 1.0, constant: 0.0),
                label.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.2, constant: 0.0)
            ])
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Снимок экрана

Scrollable rows using UIStackView inside UICollectionViewCell

Спасибо за ответ мужик. Я поставил подробный вопрос здесь. Можешь взглянуть?

Aakash Dave 30.05.2019 23:59

Я проверил ваш код, я думаю, что вы неправильно настраиваете ограничения. Вы добавили ограничения для представления прокрутки контейнера, но я не вижу, чтобы вы устанавливали containerScrollView.translatesAutoresizingMaskIntoConstraint‌​s = false, что не даст вам того, что вы ищете для. Вы также не используете представление стека, и кадры для представлений, добавленных в цикле for, устанавливаются явно, а не с использованием ограничений. Я прошу вас настроить пример проекта, используя приведенный выше код, понять, что происходит, и постепенно отредактировать код, чтобы он соответствовал вашему сценарию.

humblePilgrim 31.05.2019 07:46

Эй, мужик! Большое спасибо за это. На самом деле я решил это только с помощью прокрутки. Я на самом деле указывал на этот вопрос. не могли бы вы мне помочь здесь stackoverflow.com/questions/56339775/…

Aakash Dave 31.05.2019 08:58

Эй, чувак, можешь мне помочь: stackoverflow.com/questions/56656783/…

Aakash Dave 18.06.2019 23:37

Другие вопросы по теме