Доступ к свойствам макета CollectionView в объекте Layout - PullRequest
0 голосов
/ 13 мая 2019

Я реализовал подкласс UICollectionViewFlowLayout, который переопределяет только один метод func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint. В этом методе я намереваюсь получить доступ к текущим свойствам макета уже обработанного представления коллекции, например: itemSize, sectionInsets и т. Д.

Однако, когда я пытаюсь получить доступ к нему, как self.itemSize, он возвращает значение по умолчанию.

Apple Docs просит делегата CollectionView реализовать соответствующий метод делегата для каждого из этих свойств, например:

Если делегат не реализует collectionView: layout: sizeForItemAtIndexPath: метод, объект макета потока использует значение этого свойства для установки полей для каждого раздела.

Я реализовал все эти методы делегата в моем View Controller.

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

Это правильный способ доступа к свойствам макета в объекте потока в collectionview?

let delegate = self.collectionView!.delegate as! UICollectionViewDelegateFlowLayout
let itemSize = delegate.collectionView(<#T##collectionView: UICollectionView##UICollectionView#>, layout: <#T##UICollectionViewLayout#>, sizeForItemAt: <#T##IndexPath#>)

Если да, то почему это такой затяжной подход? Если нет, то что мне не хватает?

1 Ответ

0 голосов
/ 14 мая 2019

Если все ячейки имеют одинаковый размер, вы должны установить itemSize и не использовать метод делегата. Вы можете установить это в построителе интерфейса, выбрав представление вашей коллекции, выбрав инспектор размера и установив размер ячейки. Или вы можете установить это в начале жизненного цикла вашего подкласса UICollectionViewFlowLayout.

Если ячейки имеют динамический размер, вам необходимо вызвать метод делегата, чтобы определить размер. Вы правы, что вам нужно получить доступ к delegate через представление коллекции. Вероятно, это сделано потому, что UICollectionViewDelegateFlowLayout расширяет UICollectionViewDelegate. Добавление вспомогательного средства доступа, например:

var delegate: UICollectionViewDelegateFlowLayout? {
    return collectionView?.delegate as? UICollectionViewDelegateFlowLayout
} 

может облегчить работу с ним.

Тем не менее, вам действительно нужно запрашивать информацию о размере только у делегата, когда макет недействителен. Похоже, что layoutAttributesForItem(at: indexPath) или layoutAttributesForElements(in: rect) можно использовать для определения информации о размере уже выложенных предметов. Оба из которых являются методами на UICollectionViewFlowLayout.

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