Я реализую 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 Привет, приятель, попробовал твое решение, но, как я уже упоминал, наличие ограничений меня не совсем убедило, а также не тренировалось. Главное было установить рамку скроллвью равной супревью и присвоить данные массива выше размера контента. Это само по себе создаст прокручиваемый контент. Но я обязательно проголосую за всю оперативную помощь, которую вы мне оказали. Ваше здоровье
Когда вы добавляете customView
в свой containerScrollView
, вы не устанавливаете ограничения между customView
и containerScrollView
.
Добавьте эти ограничения, и вы сможете увидеть свои customView
, учитывая, что ваш customView
имеет некоторую высоту. Кроме того, при добавлении дополнительного представления вам потребуется удалить нижнее ограничение последнего добавленного представления и создать нижнее ограничение для containerScrollView
с последним добавленным представлением.
Ну, я не совсем понимаю добавление ограничений. Я уже предоставляю рамку для прокрутки. На самом деле, если я выполняю тот же код с прокруткой на раскадровке, а все остальные запрограммированы, он работает совершенно нормально. Как только я перехожу к программированию прокрутки, все идет наперекосяк.
Постарайтесь понять ответ. Если вы создаете все программно, вам нужно добавлять ограничения тоже программно. NSLayoutConstraints.activate()
. Поскольку вы не добавляете ограничения в customView, когда добавляете его, вы не можете его увидеть, и его высота не преобразуется в высоту scrollView.
Черт! Я вижу, что вы говорите, теперь полностью вас понимаю. Мой плохой _фейспалмс_.. Итак, если я прокручиваю горизонтально, я должен заменить левое и правое ограничения, верно?
да. Если вы добавляете новый вид справа, вам нужно заменить правое ограничение последнего вида и создать цепочку с новым видом. Затем добавьте правое ограничение нового представления справа от суперпредставления, тем самым завершив цепочку.
Итак, в этом случае мне нужно, чтобы мои взгляды были однозначно идентифицированы? Не могли бы вы немного помочь мне с цепочкой?
Checkout горизонтальное представление стека, предоставляемое iOS. Это поможет вам с цепочкой.
Ну, я знаю об этом. Я не могу понять это на данный момент. Вы предлагаете добавить их в представление стека вообще? Просто пытаюсь четко понять вашу точку зрения
да. Добавьте представление стека в представлении прокрутки. Затем добавьте свои пользовательские представления в представление стека. Stackview начнет расти, как и ваш вид прокрутки.
Я создал образец приложения для вашего варианта использования. Я вставляю код и полученный снимок экрана ниже. Надеюсь, это та функциональность, которую вы ищете. Я предлагаю вам вставить это в новый проект и настроить код, пока вы не будете удовлетворены. Я добавил комментарии, чтобы было понятно.
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")
}
}
Снимок экрана
Спасибо за ответ мужик. Я поставил подробный вопрос здесь. Можешь взглянуть?
Я проверил ваш код, я думаю, что вы неправильно настраиваете ограничения. Вы добавили ограничения для представления прокрутки контейнера, но я не вижу, чтобы вы устанавливали containerScrollView.translatesAutoresizingMaskIntoConstraints = false, что не даст вам того, что вы ищете для. Вы также не используете представление стека, и кадры для представлений, добавленных в цикле for, устанавливаются явно, а не с использованием ограничений. Я прошу вас настроить пример проекта, используя приведенный выше код, понять, что происходит, и постепенно отредактировать код, чтобы он соответствовал вашему сценарию.
Эй, мужик! Большое спасибо за это. На самом деле я решил это только с помощью прокрутки. Я на самом деле указывал на этот вопрос. не могли бы вы мне помочь здесь stackoverflow.com/questions/56339775/…
Эй, чувак, можешь мне помочь: stackoverflow.com/questions/56656783/…
Если на ваш вопрос дан ответ, вы должны закрыть вопрос, приняв ответ.