1

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

enter image description here

Iphone 7, как я построил его - поля нормальная: ширина CV 339

enter image description here

---- 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. Но это также наполняет клетки, поскольку они забивают больше за линию.

enter image description here

меньший экран, аналогичная проблема с клетками:

enter image description here

ответ

0

Решение состоит в том, чтобы осуществить UICollectionViewDelegateFlowLayout и вызвать sizeForItemAt как это:

extension YourClass: UICollectionViewDelegateFlowLayout { 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    //return size needed 
    return CGSize(width: (width/6 - (width/37.5)), height: (width/6 - (width/37.5))) 
} 

Во время выполнения возвращаемым размер будет тот, который дает элемент Размер.

Примечание: осуществление sizeForItemAt без UICollectionViewDelegateFlowLayout не удастся

Смежные вопросы