Im пытается использовать оцененныйItemSize для динамического изменения размера коллекцииВыберите ячейки, чтобы они соответствовали их башне контента. У меня возникло несколько проблем с разными размерами устройств и, в частности, с шириной, не изменяющейся по размеру, как в интерфейсе.CollectionView оцениваетсяItemSize не работает как ожидалось
Я сделал свой материал Interface Builder на iPhone 7, поэтому ширина экрана 375. В моем рассказном посте у меня есть следующее.
- outerCollectionView возлагали на всех 4-х сторон SuperView с 0 марже
- outerCollectionView ячейка ш: 339 ч: 550
Внутри этой клетки у меня есть:
- innerCollectionView возлагали ко всем 4 сторонам ячейки с 0 маржа
- innerCollectionView постоянная w: 339 ч: 550 добавлено в IB
Внутри моя DataSource и класс делегата я определил мое расположение потока в функции viewDidLoad:
let width = UIScreen.main.bounds.size.width
let height = UIScreen.main.bounds.size.height
let flow = outerCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
flow.estimatedItemSize = CGSize(width: width - ((width/18.75)), height: height/4)
flow.minimumLineSpacing = (width/37.5)
flow.sectionInset = UIEdgeInsets(top: (width/37.5), left: (width/37.5), bottom: (width/37.5), right: (width/37.5))
А внутри пользовательского класса клеток, который содержит «внутреннюю» коллекцию я установить некоторые из этих постоянных ограничений и определить расположение потока по размеру элементы:
// This is the correct screen size
// let width = innerCollectionView.frame.size.width
let width = UIScreen.main.bounds.size.width
let flow = innerCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
flow.sectionInset = UIEdgeInsetsMake((width/37.5), (width/37.5), (width/37.5), (width/37.5))
flow.itemSize = CGSize(width: (width/6 - (width/37.5)), height: (width/6 - (width/37.5)))
flow.minimumInteritemSpacing = (width/37.5)
flow.minimumLineSpacing = (width/37.5)
innerCollectionHeight.constant = innerCollectionView.collectionViewLayout.collectionViewContentSize.height
innerCollectionWidth.constant = innerCollectionView.collectionViewLayout.collectionViewContentSize.width
Теперь все это работает отлично, и клетка размера по вертикали, чтобы соответствовать моему содержанию хорошо на iPhone 7 тренажера, показывая отдельные клетки столбцов правильно заселенных. Но когда я увеличиваю размер устройства, он не регулирует ширину ячейки. И когда я спускаюсь на меньшее устройство, я получаю целую кучу ошибок Xcode о том, как ширина ячейки является большой, потому что она не была изменена, но ничего не отображается. (некоторые фото ниже)
2017-02-16 12:53:49.632 ParseStarterProject-Swift[26279:394906] The behavior of the UICollectionViewFlowLayout is not defined because:
2017-02-16 12:53:49.632 ParseStarterProject-Swift[26279:394906] the item width must be less than the width of the UICollectionView minus the section insets left and right values, minus the content insets left and right values.
2017-02-16 12:53:49.632 ParseStarterProject-Swift[26279:394906] Please check the values returned by the delegate.
2017-02-16 12:53:49.633 ParseStarterProject-Swift[26279:394906] The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7be38920>, and it is attached to <UICollectionView: 0x7db03600; frame = (0 0; 320 504); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7d61a550>; layer = <CALayer: 0x7be95880>; contentOffset: {0, 0}; contentSize: {320, 20}> collection view layout: <UICollectionViewFlowLayout: 0x7be38920>.
Так, очевидно, я не могу использовать
flow.itemSize =
установить размер внешней клетки, потому что мне нужно ориентировочный размер, чтобы отрегулировать длину по вертикали и обнимаются содержание. Я просто не могу понять, почему ширина не растет в соответствии с размером экрана?
Большой размер устройства - рентабельность слишком большой: ширина CV 339
Iphone 7, как я построил его - поля нормальная: ширина CV 339
---- EDIT -----
попробовал переопределить szeForItemAt, но никаких изменений.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = self.view.frame.size.width
let height = self.view.frame.size.height
if collectionView == self.outerCollectionView {
return CGSize(width: width - 100, height: height/4)
} else {
return CGSize(width: (width/6 - (width/75)), height: (width/6 - (width/75)))
}
}
---- EDIT ----
я могу редактировать предпочтительный элемент захватить клетки.Использование опции сжатого размера для высоты и установками своего собственного размера для ширины (ширина/18,7) ширина минус левые и правая вставка определена ранее
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
let attributes = layoutAttributes.copy() as! UICollectionViewLayoutAttributes
let width = UIScreen.main.bounds.size.width
let desiredWidth = width - (width/18.75)
//let desiredWidth = systemLayoutSizeFitting(UILayoutFittingExpandedSize).width
let desiredHeight = systemLayoutSizeFitting(UILayoutFittingCompressedSize).height
attributes.frame.size.width = desiredWidth
attributes.frame.size.height = desiredHeight
return attributes
}
Бу этого питание до ограничения, как показано ниже на изображении, который, я думаю, может быть просто сценарием, который я запускаю для филе верхних углов UIViews. Но это также наполняет клетки, поскольку они забивают больше за линию.
меньший экран, аналогичная проблема с клетками: