UIScrollView или UICollectionView, чтобы пролистывать изображения в порядке вызова из firebase? - PullRequest
0 голосов
/ 04 марта 2019

Мое приложение имеет функцию, в которой вы отвечаете на вопросы о людях, за которыми вы следуете, например (Варианты A, B, C, D - это имена пользователей):

How the page should look

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

Япытаясь использовать UIScrollView, но все изображения наложены друг на друга вместо возможности пролистывания между ними (и метка вопроса исчезла)

Есть ли способ заставить работать ScrollView илиесть лучший / более эффективный способ интеграции UICollectionView (я видел несколько постов, которые рекомендуют это для похожих вещей)?

Я новичок в этом, поэтому был бы признателен за любую помощь, заранее спасибо :)


ОБНОВЛЕНИЕ:

Я отредактировал ограничения, чтобы левые и правые привязки представлений изображений были правильными, и добавил UIView поверх UIScrollView на раскадровке.Я также видел, что это можно сделать с помощью UIPageViewController?

@IBOutlet weak var userImageScrollView: UIScrollView!
@IBOutlet weak var contentView: UIView!
@IBOutlet weak var questionLabel: UILabel!
@IBOutlet weak var optionA: UIButton!
@IBOutlet weak var optionB: UIButton!
@IBOutlet weak var optionC: UIButton!
@IBOutlet weak var optionD: UIButton!

func setupLayout() {
    userImageScrollView.isPagingEnabled = true
    userImageScrollView.isScrollEnabled = true

    userImageScrollView.addSubview(imageViewA)
    imageViewA.translatesAutoresizingMaskIntoConstraints = false
    imageViewA.widthAnchor.constraint(equalTo: userImageScrollView.widthAnchor).isActive = true
    imageViewA.heightAnchor.constraint(equalTo: userImageScrollView.heightAnchor).isActive = true
    imageViewA.topAnchor.constraint(equalTo: userImageScrollView.topAnchor).isActive = true
    imageViewA.bottomAnchor.constraint(equalTo: userImageScrollView.bottomAnchor).isActive = true
    imageViewA.leftAnchor.constraint(equalTo: userImageScrollView.leftAnchor)
    imageViewA.rightAnchor.constraint(equalTo: imageViewB.leftAnchor)
    imageViewA.contentMode = .scaleAspectFit

    userImageScrollView.addSubview(imageViewB)
    imageViewB.translatesAutoresizingMaskIntoConstraints = false
    imageViewB.widthAnchor.constraint(equalTo: userImageScrollView.widthAnchor).isActive = true
    imageViewB.heightAnchor.constraint(equalTo: userImageScrollView.heightAnchor).isActive = true
    imageViewB.bottomAnchor.constraint(equalTo: userImageScrollView.bottomAnchor).isActive = true
    imageViewB.leftAnchor.constraint(equalTo: imageViewA.rightAnchor)
    imageViewA.rightAnchor.constraint(equalTo: imageViewC.leftAnchor)
    imageViewB.contentMode = .scaleAspectFit

    userImageScrollView.addSubview(imageViewC)
    imageViewC.translatesAutoresizingMaskIntoConstraints = false
    imageViewC.widthAnchor.constraint(equalTo: userImageScrollView.widthAnchor).isActive = true
    imageViewC.heightAnchor.constraint(equalTo: userImageScrollView.heightAnchor).isActive = true
    imageViewC.bottomAnchor.constraint(equalTo: userImageScrollView.bottomAnchor).isActive = true
    imageViewC.leftAnchor.constraint(equalTo: imageViewB.rightAnchor)
    imageViewC.rightAnchor.constraint(equalTo: imageViewD.leftAnchor)
    imageViewC.contentMode = .scaleAspectFit

    userImageScrollView.addSubview(imageViewD)
    imageViewD.translatesAutoresizingMaskIntoConstraints = false
    imageViewD.widthAnchor.constraint(equalTo: userImageScrollView.widthAnchor).isActive = true
    imageViewD.heightAnchor.constraint(equalTo: userImageScrollView.heightAnchor).isActive = true
    imageViewD.bottomAnchor.constraint(equalTo: userImageScrollView.bottomAnchor).isActive = true
    imageViewD.leftAnchor.constraint(equalTo: imageViewC.rightAnchor)
    imageViewD.rightAnchor.constraint(equalTo: userImageScrollView.rightAnchor)
    imageViewD.contentMode = .scaleAspectFit

    self.userImageScrollView.delegate = self
}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Причина, по которой ваши imageViews располагаются друг над другом, заключается в том, что вы определяете:

 imageViewB.leftAnchor.constraint(equalTo: imageViewA.leftAnchor)

Это означает: левая сторона imageView B совпадает с левой частью imageViewA, фактически говоря, что их левые стороныоба начинаются в одном и том же месте, поэтому они будут друг над другом.

Таким образом, вам нужно определить каждый элемент слева направо:

imageViewB.leftAnchor.constraint(equalTo: imageViewA.rightAnchor)

imageViewBs слева, начинается справа от imageViewA.imageView Cs leftAnchor будет равен imageViewBs right и так далее, пока вы не достигнете окончательного imageViewD, где вам нужно будет иметь значение leftAnchor, равное imageViewCs rightAnchor, и imageViewDs rightAnchor, равное scrollViews rightAnchor, чтобы обеспечить правильную работу прокрутки.

Вы также можете легко делать то, что хотите, с помощью scrollView, если вы хотите прокрутить Вниз вместо лево-правого, вместо левого и правого якорей, используйте centerXAnchors, чтобы держать представления в центре scrollView

Вы должны представить, что кто-то описывает макет, ImageViewA находится сверху, поэтому его верхняя привязка равна верхней привязке scrollViews.

С imageViewB вы делаете то же самое, описывая его сверху вниз, поэтому:

 imageViewB.topAnchor.constraint(equalTo: imageViewA.bottomAnchor).isActive = true

Верх изображения B начинается в нижней части imageView A, затем вы делаете то же самое состальное примерно так:

 imageViewC.topAnchor.constraint(equalTo: imageViewC.bottomAnchor).isActive = true

и

 imageViewD.topAnchor.constraint(equalTo: imageViewC.bottomAnchor).isActive = true

Поскольку это scrollView, а вы прокручиваете вниз, верх (imageViewA) должен быть установлен вверху прокруткипредставление, и дополнительно нижний элемент должен определить свой bottomAnchor к нижней части scrollView для правильной работы прокрутки:

  imageViewD.bottomAnchor.constraint(equalTo: userImageScrollView.bottomAnchor).isActive = true 

Вы также используете centerXAnchor и leftAnchor вместе в некоторых изПредставьте себе, что centerXAnchor - это то же самое, что и leftAnchor, но просто описывает его с другой части представления, так как ваш centerXAnchor идет после leftAnchor, он просто будет использовать centerX, что означает, что изображение будет центромв scrollView.

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

ОБНОВЛЕНИЕ:

Этот код будет делать именно то, что вы хотите, обратите внимание на высоту и ширину вида прокрутки и константы, которые я использую, чтобы освободить место.Каждый imageView определяется так, как я сказал выше, слева направо, при этом последний элемент имеет ограничения слева и справа.удалите ваш setupLayout и замените его следующим (убедитесь, что при необходимости измените ограничения в соответствии с вашим приложением):

 func setupLayout() {
    view.addSubview(scrollView)
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.topAnchor.constraint(equalTo: view.topAnchor, constant: 50).isActive = true
    scrollView.heightAnchor.constraint(equalToConstant: 300).isActive = true
    scrollView.widthAnchor.constraint(equalToConstant: 300).isActive = true
    scrollView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    scrollView.backgroundColor = .gray
    scrollView.isPagingEnabled = true

    scrollView.addSubview(imageViewA)
    imageViewA.translatesAutoresizingMaskIntoConstraints = false

    imageViewA.widthAnchor.constraint(equalToConstant: 250).isActive = true
    imageViewA.heightAnchor.constraint(equalToConstant: 250).isActive = true

    imageViewA.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 25).isActive = true
    imageViewA.leftAnchor.constraint(equalTo: scrollView.leftAnchor, constant: 25).isActive = true

    imageViewA.backgroundColor = .cyan

    scrollView.addSubview(imageViewB)
    imageViewB.translatesAutoresizingMaskIntoConstraints = false

    imageViewB.heightAnchor.constraint(equalToConstant: 250).isActive = true
    imageViewB.widthAnchor.constraint(equalToConstant: 250).isActive = true


    imageViewB.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 25).isActive = true
    imageViewB.leftAnchor.constraint(equalTo: imageViewA.rightAnchor, constant: 25).isActive = true

    imageViewB.backgroundColor = .red

    scrollView.addSubview(imageViewC)
    imageViewC.translatesAutoresizingMaskIntoConstraints = false

    imageViewC.heightAnchor.constraint(equalToConstant: 250).isActive = true
    imageViewC.widthAnchor.constraint(equalToConstant: 250).isActive = true


    imageViewC.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 25).isActive = true
    imageViewC.leftAnchor.constraint(equalTo: imageViewB.rightAnchor, constant: 25).isActive = true

    imageViewC.backgroundColor = .black

    scrollView.addSubview(imageViewD)
    imageViewD.translatesAutoresizingMaskIntoConstraints = false

    imageViewD.heightAnchor.constraint(equalToConstant: 250).isActive = true
    imageViewD.widthAnchor.constraint(equalToConstant: 250).isActive = true


    imageViewD.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 25).isActive = true
    imageViewD.leftAnchor.constraint(equalTo: imageViewC.rightAnchor, constant: 25).isActive = true
    imageViewD.rightAnchor.constraint(equalTo: scrollView.rightAnchor, constant: -25).isActive = true

    imageViewD.backgroundColor = .green


}

Вот рисунок того, что делает этот код:

через GIPHY

  • Не забудьте позвонить setupLayout в viewDidLoad()

     override func viewDidLoad() {
    super.viewDidLoad()
    
    setupLayout()
    // Do any additional setup after loading the view, typically from a nib.
     }
    
0 голосов
/ 04 марта 2019

да, вы можете использовать CollectionView с pagingnation.just включить опцию подкачки CollecitonView.

1.Добавить горизонтальное представление коллекции в верхней области вашего представления.Включите параметр подкачки из свойства Selector.

  1. Перетащите ячейку CollectionView в CollectionView.Изменить размер ячейки, чтобы заполнить весь CollectionView
  2. добавить изображение в ячейку

  3. настроить делегата и источник данных.

enter image description here

https://medium.com/@shaibalassiano/tutorial-horizontal-uicollectionview-with-paging-9421b479ee94

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...