UICollectionView макет ячейки не сбрасывает ранее установленные границы - PullRequest
1 голос
/ 11 апреля 2019

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

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

Я установил границы внутри этого метода:

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

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

Редактировать: вот как я строю свою ячейку и устанавливаю границы:

cell.label.text = MATRIX[indexPath.section][indexPath.row]
cell.layer.backgroundColor = UIColor.red.cgColor    

if indexPath.section == 0 && indexPath.row == 0 {
    cell.addBorders(left: YES, right: NO, top: YES, bottom: NO)
}
if indexPath.section == 0 && indexPath.row == 1 {
    cell.addBorders(left: YES, right: YES, top: YES, bottom: YES)
}
if indexPath.section == 1 && indexPath.row == 0 {
    cell.addBorders(left: YES, right: NO, top: NO, bottom: YES)
}
if indexPath.section == 1 && indexPath.row > 0 {
    cell.addBorders(left: YES, right: NO, top: NO, bottom: YES)
}
if indexPath.section > 1 && indexPath.row == 1 {
    cell.addBorders(left: YES, right: NO, top: NO, bottom: NO)
}
if indexPath.row == MATRIX[0].count {
    cell.addBorders(left: NO, right: YES, top: NO, bottom: NO)
}
if indexPath.section == MATRIX.count {
    cell.addBorders(left: NO, right: NO, top: NO, bottom: YES)
}

Метод расширения UICollectionViewCell для добавления границ:

func addBorders(left: Bool, right: Bool, top: Bool, bottom: Bool) {
    if left {
        self.layer.addBorder(edge: .left, thickness: 1)
    }
    if right {
        self.layer.addBorder(edge: .right, thickness: 1)
    }
    if top {
        self.layer.addBorder(edge: .top, thickness: 1)
    }
    if bottom {
        self.layer.addBorder(edge: .bottom, thickness: 1)
    }
}

Метод расширения CALayer:

func addBorder(edge: UIRectEdge, thickness: CGFloat) {

    let border = CALayer()
    switch edge {
    case UIRectEdge.top:
        border.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: thickness)
        break
    case UIRectEdge.bottom:
        border.frame = CGRect(x:0, y:self.frame.height - thickness, width:self.frame.width, height:thickness)
        break
    case UIRectEdge.left:
        border.frame = CGRect(x:0, y:0, width: thickness, height: self.frame.height)
        break
    case UIRectEdge.right:
        border.frame = CGRect(x:self.frame.width - thickness, y: 0, width: thickness, height:self.frame.height)
        break
    default:
        break
    }

    border.backgroundColor = UIColor.darkGray.cgColor
    self.addSublayer(border)
}

Ответы [ 3 ]

0 голосов
/ 11 апреля 2019

Сначала объявите глобальную переменную, например

var flagForBoarder = 1

Затем вы проверяете в представлении коллекции cellforItemAt

if flagForBoarder == 1
{
cell.view.layer.boarderColor = UIcolor.red.cgcolor
}
else
{
cell.view.layer.boarderColor = UIcolor.blue.cgcolor
}

установить значение FlagForBoarder при нажатии на кнопку или перезагрузить коллекцию просмотра

flagForBoarder = 2
0 голосов
/ 11 апреля 2019

попробуйте использовать два пользовательских UICollectionViewCell для двух разных наборов данных

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView == gamePad{
        var cell: UICollectionViewCell?
        cell = gamePad.dequeueReusableCell(withReuseIdentifier: "coloredCell", for: indexPath)
        cell?.backgroundColor = UIColor.gray
        cell?.layer.cornerRadius = (cell?.frame.height)!/2
        return cell!
    }
    if collectionView == blackCounterCV {
       let cell = blackCounterCV.dequeueReusableCell(withReuseIdentifier: "blackC", for: indexPath) as! BlackCCollectionViewCell
        cell.backgroundColor = UIColor.black
        cell.layer.cornerRadius = (cell.frame.height)/2
        cell.blackLbl.text = "TEST"
        return cell
    }       
     return UICollectionViewCell()
}
0 голосов
/ 11 апреля 2019

Внутри ячейки представления коллекции есть метод экземпляра , называемый prepareForReuse :

override func prepareForReuse() {
    super.prepareForReuse()
    // make your borders nil or reset them
}
...