Горизонтальная и вертикальная коллекция. Виды в том же виде. Контроллер - PullRequest
2 голосов
/ 21 марта 2020

Мне нужно показать в viewController два collectionViews.

Вверху - одна строка, а затем на остальной части представления - collectionView с вертикальной прокруткой и двумя столбцами.

Это текущий фрагмент кода для отображения обоих коллекций:

@IBOutlet weak var collectionViewMarcas: UICollectionView!

var marcas = [Marcas]()

@IBOutlet weak var collectionViewDispositivos: UICollectionView!

var dispositivos = [Dispositivos]()


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    if collectionView == collectionViewMarcas {
        return marcas.count
    }

        return dispositivos.count



}




   func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

      // print("MARCA:"+marcas[indexPath.row].nombre)
   }


   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


    if collectionView == self.collectionViewMarcas {
              let cellMarcas = collectionView.dequeueReusableCell(withReuseIdentifier: "marca", for: indexPath) as! MarcasCollectionViewCell
               let foto_marca = marcas[indexPath.row].icono
                       print(foto_marca)


                       let url = URL(string: "https://.../iconos/"+foto_marca)

                       UIImage.loadFrom(url: url!) { image in
                           cellMarcas.icono_marca.image = image

                       }


              return cellMarcas
          }

          else {
               let cellDisp = collectionView.dequeueReusableCell(withReuseIdentifier: "dispositivo", for: indexPath) as! DispositivosCollectionViewCell

             let foto_dispos = dispositivos[indexPath.row].foto_dispositivo
             print(foto_dispos)

        let modelo = dispositivos[indexPath.row].modelo_del_dispositivo
        cellDisp.modelo_disp.text = modelo
        let precio = dispositivos[indexPath.row].precio_dispositivo + " €"
        cellDisp.precio_disp.text = precio
        let marca = dispositivos[indexPath.row].logo_marca
        let urlmarca = URL(string: "https://../iconos/"+marca)
        UIImage.loadFrom(url: urlmarca!) { image in
                       cellDisp.marca_logo.image = image

                   }
        let urlfoto = URL(string: "https://.../dispositivos/"+foto_dispos)

        UIImage.loadFrom(url: urlfoto!) { image in
            cellDisp.foto_disp.image = image

        }

              return cellDisp
          }


   }

Вот скриншот:

enter image description here

Я попытался реализовать UICollectionViewDelegateFlowLayout, а затем

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let padding: CGFloat =  50
        let collectionViewSize = collectionView.frame.size.width - padding

        return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }

Эта реализация отлично работает для вертикального collectionView, но она также меняет горизонтальный.

Как можно получить только измененный вертикальный макет?

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Вам необходимо вернуть оба представления коллекции Размер метода collectionViewLayout делегата

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

//You only apply the changes to collectionViewMarcas
 if collectionView == self.collectionViewMarcas 
 {
    let padding: CGFloat =  50
    let collectionViewSize = collectionView.frame.size.width - padding

    return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
  }

  // Here Below Line You need To return collectionViewDispositivos cell size
  return CGSize(width: 60, height: 60)
}
1 голос
/ 21 марта 2020

В вашем методе cellForItemAt вы правильно проверяете, какому представлению коллекции вы назначаете ячейку. В основном вы должны сделать то же самое в collectionView(_:layout:sizeForItemAt:).

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

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    //You only apply the changes to collectionViewMarcas
    if collectionView == self.collectionViewMarcas {
        let padding: CGFloat =  50
        let collectionViewSize = collectionView.frame.size.width - padding

        return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }
}
...