Программно изменить первый элемент в UICollectionView - PullRequest
1 голос
/ 08 ноября 2019

В настоящее время я рендеринг 10 цветных кругов, которые вы можете выбрать горизонтально. Я хотел бы программно изменить первый элемент в UICollectionView и добавить небольшое изображение камеры в первый элемент. Связанная коллекция - это просто массив значений RGB. Я установил для первого все 0, так что это уникальный цвет, который никогда не будет использоваться.

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

func collectionView(_ collectionView: UICollectionView, willDisplay: UICollectionViewCell, forItemAt: IndexPath) {
...
...

//Define the first item as the indexpath 0,0
let firstItem:IndexPath = IndexPath(row: 0, section: 0)


if (forItemAt == myIndexPath)
 {
   coloredCircle.addSubview(cameraImageView!) 
 }
else {
   cameraImageView!.removeFromSuperview()   
 }

Итак, выше я думал, что я проверю, появится ли первый элемент, и затем добавлюэто к подпредставлению, иначе я заберу это (потому что это, казалось, складывалось каким-то странным образом).

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

Так что, если я прокручиваю медленно, так что первый элемент не виден, а затем медленно прокручиваю его обратно, он появляется и работает правильно!

enter image description here

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

enter image description here

Любые предложенияили как я могу сделать так, чтобы первый круг был постоянно маленькой камерой?

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Вам не нужно помещать логику в willDisplay, вместо этого вы можете просто использовать UIImageView внутри вашего цветного круга и просто скрыть / показать его на основе indexPath. Кроме того, поместите изображение с вашей камеры в ImageView.

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

    let firstItem:IndexPath = IndexPath(row: 0, section: 0)
    if indexPath == firstItem {
        coloredCircle.imageView.isHidden = flase
    }else{
        coloredCircle.imageView.isHidden = true
    }

}
0 голосов
/ 08 ноября 2019

Пожалуйста, добавьте эти делегат, источник данных и делегат FlowLayout

UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout

Создать выход для представления коллекции

@IBOutlet weak var currentCollectionView: UICollectionView!

Определить идентификатор повторного использования для ячейки

let reuseIdentifier = "actionCell";

УстановитьДелегат и источник данных для представления коллекции

currentCollectionView.delegate = self
currentCollectionView.dataSource = self

Регистрация ячейки для представления коллекции с повторным использованием Идентификатор

currentCollectionView.register(UINib(nibName: "ActionCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier)

Реализация UICollectionView Делегат, источник данных и FlowLayoutDelegate

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {

    return 4;
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {

    return 1;
}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {

    return 1
}

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

    return 10
}

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ActionCollectionViewCell

    cell.vwAction?.layer.cornerRadius = 25.0
    cell.vwAction?.clipsToBounds = true

    if indexPath.row == 0 {

        let imgAction = UIImage(named: "Camera")
        cell.imgAction?.image = imgAction
        cell.vwAction?.backgroundColor = UIColor.black
    } else {

        cell.imgAction?.image = nil
        cell.vwAction?.backgroundColor = self.randomColor()
    }

    return cell
}

Функциякоторые генерируют случайный цвет

func randomColor() -> UIColor {

    let red = CGFloat(drand48())
    let green = CGFloat(drand48())
    let blue = CGFloat(drand48())
    return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}

ActionCollectionViewCell Desing enter image description here

0 голосов
/ 08 ноября 2019

Вы можете сделать 2 разные ячейки. 1 ячейка будет содержать вид с камеры, а другая ячейка будет содержать цветной вид.

И в методе CellforRow вы можете вернуть соответствующую ячейку в соответствии с вашими требованиями.

Заранее извините, если это не то, что вы ищете. Поскольку это первый раз, когда я отвечаю на любой вопрос. :)

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