Настройте коллекцию с помощью тегов - PullRequest
0 голосов
/ 03 октября 2018

Я работал с пользовательским UICollectionViewFlowLayout, чтобы настроить промежутки между ячейками, чтобы я мог получить хороший поток в моем collectionView.Но с моим текущим кодом я не могу понять, как я могу регулировать размеры ячеек, не нарушая счетчик строк.Это заставляет некоторые клетки думать, что они могут поместиться в строку, но они не могут.

Мой пользовательский поток

class UserProfileTagsFlowLayout: UICollectionViewFlowLayout {

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributesForElementsInRect = super.layoutAttributesForElements(in: rect)
        var newAttributesForElementsInRect = [UICollectionViewLayoutAttributes]()

        var leftMargin: CGFloat = 0.0;

        for attributes in attributesForElementsInRect! {
            if (attributes.frame.origin.x == self.sectionInset.left) {
                leftMargin = self.sectionInset.left
            } else {
                var newLeftAlignedFrame = attributes.frame
                newLeftAlignedFrame.origin.x = leftMargin
                attributes.frame = newLeftAlignedFrame
            }
            leftMargin += attributes.frame.size.width + 8 // Makes the space between cells
            newAttributesForElementsInRect.append(attributes)
        }

        return newAttributesForElementsInRect
    }
}

Так что в моем ViewController я расширил

extension myViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let tag = tagsArray[indexPath.row]
        let font = UIFont(name: "Raleway", size: 14)!
        let size = tag.value.size(withAttributes: [NSAttributedString.Key.font: font])
        let dynamicCellWidth = size.width

        /*
          The "+ 20" gives me the padding inside the cell
        */
        return CGSize(width: dynamicCellWidth + 20, height: 35)
    }

    // Space between rows
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 5
    }

    // Space between cells
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 10
    }
}

Когда я пробую этот код, я получаю результат в разделе результатов на iPhone X. Вы можете увидеть, что тег «Машинное обучение» спрыгивает вниз на новую строку, потому что он думает, что он может соответствовать строкевыше.Если я уберу «заполнение» для ячейки в функции sizeForItem, у меня не возникнет этой проблемы.Но это выглядит просто ужасно.

Итак, мой вопрос: Как я могу использовать заполнение для своих ячеек, не нарушая flowLayout?


Пока мой текущий результат выглядит так:

iPhone X:

iPhone X result

1 Ответ

0 голосов
/ 03 октября 2018

Может быть, это поможет вам.Я думаю, что вы должны проверить, если ваш товар выпирает из коллекции справа.В layoutAttributesForElements методе отметьте это:

        let collectionViewWidth = self.collectionView?.frame.width - (self.sectionInset.right + self.sectionInset.left)

        if (attributes.frame.origin.x + attributes.frame.size.width > collectionViewWidth) {
            var newLeftAlignedFrame = attributes.frame
            newLeftAlignedFrame.origin.x = self.sectionInset.left
            attributes.frame = newLeftAlignedFrame 
        }

Обновил мой ответ, и он работает для меня, вы можете увидеть его на скриншоте

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