Как настроить Размер ячейки UICollectionView для каждого класса размера?
Я нахожу трение при попытке создать отзывчивый / адаптивный UICollectionViewCells
на UIStoryboard
.
проблема, которую я вижу, заключается в том, что вы, похоже, не можете установить Cell Size
per Size Class
и я пытаюсь выяснить, правильный подход к этому. Я разработал клетки, чтобы приспособиться к их контейнерам, так что они должны autosize независимо от класса размера. Это в основном работает в том, что если я изменю класс размера, выберите мой вид ячейки и сделайте Update Frames
затем они все подогнать их новый размер. Однако это сделка с одним выстрелом, если я вернусь к классу Any / Any size, я все еще вижу эту измененную версию.
вот, что я знаю, я мог бы попробовать:
- Создайте несколько ячеек с фиксированными размерами, по одной на класс размера и в виде раскадровки. Тогда я мог только ... --9-->использовать правильный во время выполнения, но я мог бы тогда посмотреть их во время разработки.
- я мог бы создать представление коллекции для каждого класса размера, каждый из которых устанавливается только для этого размера. Это будет работать, но было бы больно управлять несколькими
UICollectionViews
- создайте мой интерфейс и / или ограничения программно (теряя видимость дизайна).
Я надеюсь, что это решенный сценарий, и я просто что-то упускаю, но я знаю, что это может быть то, что инструменты IB не соответствуют коду на данный момент.
4 ответов
решение, которое я придумал, было просто использовать тег UICollectionViewDelegateFlowLayout
и реализовать sizeForItemAtIndexPath
метод.
Это означает, что размеры ячеек могут быть установлены в соответствии с доступным Size Class
габариты.
Это все еще не идеально, как вы не можете посмотреть изменения в раскадровке, и вы не можете создать универсальный дизайн и увидеть его в различных форматах.
Я все еще надеюсь, что у кого-то есть лучший вариант.
вот аналогичное решение, закодированное в Swift. Я просто стилизовал обе свои ячейки в раскадровке и оставил их видимыми для любой комбинации классов размера. Когда коллекция признаков изменяется, я обновляю cellSize и cellReuseID, которые хочу использовать, и говорю collectionView перезагрузить все видимые ячейки. Тогда
collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
и
override func collectionView(collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
(не показано в примере кода) вызываются, что позволяет мне обновлять размер ячейки и обновлять стиль раскадровки ячейки. Так не совсем сделано в раскадровке, но достаточно хорошо, пока в Xcode не будет предоставлена дополнительная поддержка.
struct MyCollectionViewConstants{
static let CELL_ANY_ANY_REUSE_ID = "cell";
static let CELL_COMPACT_REGULAR_REUSE_ID = "cellSmall"
static let CELL_ANY_ANY_SIZE = 100;
static let CELL_COMPACT_REGULAR_SIZE = 70;
}
class MyCollectionView: UICollectionViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
var cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
var cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{
return CGSize(width: cellSize, height: cellSize)
}
override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact
&& self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClass.Regular){
cellSize = MyCollectionViewConstants.CELL_COMPACT_REGULAR_SIZE
cellReuseID = MyCollectionViewConstants.CELL_COMPACT_REGULAR_REUSE_ID
} else {
cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
}
self.collectionView.reloadItemsAtIndexPaths(
self.collectionView.indexPathsForVisibleItems())
}
}
Я застрял с той же проблемой после реализации класса(iPad и iPhone).Ну, я нашел решение. Надеюсь, это поможет!
Реализовать UICollectionViewDelegateFlowLayout.
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
var device = UIDevice.currentDevice().model
var cellSize:CGSize = CGSizeMake(155, 109)
if (device == "iPad" || device == "iPad Simulator") {
cellSize = CGSizeMake(240, 220)
}
return cellSize
}
Swift 4
Привет, Коллеги-Разработчики,
это легко сделать, если высота и ширина UICollectionViewCell одинаковы.
шаги
1. Импорт ** UICollectionViewDelegateFlowLayout**
2. Добавьте sizeForItem IndexPath метод UICOllectionView следующим образом
func collectionView(_ collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath) -> CGSize {
return CGSize(width: collectionVw.frame.size.height, height: collectionVw.frame.size.height)
}
Примечание: что происходит, вы устанавливаете высоту UICollectionView как высота и ширина UICollectionViewCell
Удачи В Кодировании :)