UICollectionView Горизонтальная прокрутка выравнивания выравнивания по центру первой ячейки, не совсем точно позиционирующая положение центра с самого начала с использованием Swift - PullRequest
1 голос
/ 17 июня 2019

Мой сценарий, я пытаюсь реализовать UICollectionView горизонтальное scrollview первое и последнее выравнивание центра ячейки на основе выбора.Здесь, в первый раз CollectionViewCell первая ячейка не показывает точное центральное положение.Если я didselect один раз все работает нормально.Мне нужно исправить первое время, когда приложение открывало первую ячейку, не показывая точную центральную позицию.

ПРИМЕЧАНИЕ: я не добавил верхний и нижний колонтитулы, также я закончил проектирование с использованием раскадровки.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let text = self.items[indexPath.row]
        let cellWidth = text.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width + 10.0
        return CGSize(width: cellWidth, height: collectionView.bounds.height)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        let inset: CGFloat = collectionView.frame.width * 0.5 - 52 * 0.5
        return UIEdgeInsets(top: 0, left: inset, bottom: 0, right: inset)
    }

1 Ответ

1 голос
/ 17 июня 2019

Вы не можете использовать 52 напрямую, поскольку в качестве cell width, так как width каждого cell равно dynamic.

Вам необходимо вычислить leftInsets и rightInsetscollectionView на основе actual width из first и last cell.

Вы можете вычислить width из first и last cell таким же образомВы использовали метод collectionView(_:layout:sizeForItemAt), используя first и last element из items array, то есть

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    //Calculate width of first cell
    var firstCellWidth: CGFloat = 52.0
    if let textAtFirstIndex = self.items.first {
        firstCellWidth = textAtFirstIndex.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width + 10.0
    }

    //Calculate width of last cell
    var lastCellWidth: CGFloat = 52.0
    if let textAtLastIndex = self.items.last {
        lastCellWidth = textAtLastIndex.size(withAttributes:[.font: UIFont.systemFont(ofSize: 14.0)]).width + 10.0
    }

    //Calculate leftInset and rightInset
    let leftInset: CGFloat = (collectionView.frame.width * 0.5) - (firstCellWidth * 0.5)
    let rightInset: CGFloat = (collectionView.frame.width * 0.5) - (lastCellWidth * 0.5)

    return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)
}

Пример:

enter image description here

Дайте мне знать, если у вас все еще есть какие-либо проблемы.

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