UICollectionViewFlowLayout оценкаItemSize нарушает ограничения во время вращения, но itemSize полностью подходит - PullRequest
0 голосов
/ 22 июня 2019

Я бы хотел отобразить несколько ячеек вида UICollection с изображениями и метками и настроить их ширину в соответствии с шириной меток. Я не хочу переопределять sizeThatFits() ни переопределять preferredLayoutAttributesFitting

Насколько я понимаю, все, что мне нужно сделать, это просто убедиться, что AutoLayout в моей ячейке в порядке, а затем использовать свойство estimatedItemSize, чтобы сделать ячейки самостоятельно изменяющими размеры.

К сожалению, это вроде верно в моем случае. Пользовательский интерфейс выглядит хорошо, но когда я поворачиваю устройство, у меня есть много сломанных ограничений. Однако, когда я просто использую свойство itemSize и делаю все мои ячейки с фиксированным размером (например, 100x150), тогда все в порядке во время вращения, никаких проблем с AutoLayout.

Так я ограничил свой UICollectionViewCell. Я действительно не знаю, почему мне пришлось использовать пустышку UIView в качестве «основного» представления для UIStackView, но Xcode много плакал с проблемами AutoLayout без него. В целях тестирования я поместил это представление вне ячейки, но в отдельном UIViewController, чтобы проверить, в порядке ли AutoLayout - похоже, что это так.

enter image description here

И этот код для моего ViewController:

import UIKit

class ViewController: UIViewController {
@IBOutlet var myCollectionView: UICollectionView!

let items: [Item] = [
    Item(title: "Cell 1"),
    Item(title: "Cell 2"),
    Item(title: "Cell 3"),
    Item(title: "Cell 4"),
    Item(title: "Cell 5"),
    Item(title: "Cell 6")
]

override func viewDidLoad() {
    super.viewDidLoad()

    guard let layout = myCollectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
        fatalError("Impossibruuu - layout is not FlowLayout")
    }

    myCollectionView.register(UINib(nibName: "MyCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "MyCollectionViewCell")
    layout.minimumInteritemSpacing = 10
    layout.minimumLineSpacing = 50
    // line below makes AutoLayout angry during rotations
    layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize 
    // this is completely fine
    //layout.itemSize = CGSize(width: 100, height: 150) 
    }
}

extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return items.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCollectionViewCell", for: indexPath) as? MyCollectionViewCell else { return UICollectionViewCell() }

    cell.text = items[indexPath.row].title
    return cell
    }
}

К сожалению, при использовании layout.estimatedItemSize У меня совершенно странный журнал:

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
2019-06-22 18:53:18.841709+0200 CollectionViewSelfSizing[55280:2953587] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
  Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x600003d6e170 UIImageView:0x7fe820c1ac90.height == 100   (active)>",
    "<NSLayoutConstraint:0x600003d6ebc0 V:[UIStackView:0x7fe820c1a020]-(0)-|   (active, names: '|':UIView:0x7fe820c19e40 )>",
    "<NSLayoutConstraint:0x600003d6ec60 V:|-(0)-[UIStackView:0x7fe820c1a020]   (active, names: '|':UIView:0x7fe820c19e40 )>",
    "<NSLayoutConstraint:0x600003d6ed00 V:[UIView:0x7fe820c19e40]-(0)-|   (active, names: '|':UIView:0x7fe820c19c60 )>",
    "<NSLayoutConstraint:0x600003d6eda0 V:|-(0)-[UIView:0x7fe820c19e40]   (active, names: '|':UIView:0x7fe820c19c60 )>",
    "<NSLayoutConstraint:0x600003d6cd70 'UISV-canvas-connection' UIStackView:0x7fe820c1a020.top == UIImageView:0x7fe820c1ac90.top   (active)>",
    "<NSLayoutConstraint:0x600003d6cf50 'UISV-canvas-connection' V:[UILabel:0x7fe820c1d0c0'Cell 1']-(0)-|   (active, names: '|':UIStackView:0x7fe820c1a020 )>",
    "<NSLayoutConstraint:0x600003d6ce60 'UISV-spacing' V:[UIImageView:0x7fe820c1ac90]-(19)-[UILabel:0x7fe820c1d0c0'Cell 1']   (active)>",
    "<NSLayoutConstraint:0x600003d644b0 'UIView-Encapsulated-Layout-Height' UIView:0x7fe820c19c60.height == 50   (active)>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600003d6e170 UIImageView:0x7fe820c1ac90.height == 100   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...