Добавьте cornerRadius к 1-й и 3-й UICollectionViewCell в 3 ячейках на макет строки - PullRequest
0 голосов
/ 02 июня 2019

У меня есть UICollectionView, у которого есть 3 ячейки в строке. Мне нужно установить topLeft и bottomLeft cornerRadius для левого, а topRight и bottomRight для правого. В центре нет cornerRadius.

Cell looks like this

Метод расширения наборов cornerRadius

func setRadius(corners: UIRectCorner, radius: CGFloat) {
    let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    layer.mask = mask
}

Я использовал этот код, чтобы узнать, какая из ячеек должна иметь cornerRadius.

    let index = indexPath.row

    if index == 0 || index % 3 == 0 {
        cell.setRadius(corners: [.topLeft, .bottomLeft], radius: TPSetting.cornerRadius)
    }

    else  if ( index - 2) % 3 == 0 {
        cell.setRadius(corners: [.topRight, .bottomRight], radius: TPSetting.cornerRadius)
    } else {
        cell.layer.cornerRadius = 0
    } 

Впервые работает, как и ожидалось. Но когда при вызове collectionView.reloadData() он портится, и в центр попадают также topRight и bottomRight cornerRadius.

Как решить эту проблему?

1 Ответ

4 голосов
/ 02 июня 2019

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

Чтобы "сбросить" введенные изменения в радиус угла, вы можете:

  • Ячейка подкласса.
  • Переопределить prepareForReuse метод в подклассеотменить изменения, внесенные в метод setRadius. Документы
  • Не забудьте вызвать super.prepareForReuse внутри переопределенного метода.

Поместить код внутри метода:

self.layer.mask = nil
self.layer.cornerRadius = 0
...