Swift: UICollectionViewCell не изменяет размер при повороте - PullRequest
0 голосов
/ 13 марта 2019

У меня collectionView и customCollectionViewCells неправильно меняют размеры на выбранных устройствах.Я работаю с cellSizes в viewWillTransition и имею разное количество ячеек для iPad и iPhone.

Моя реализация до сих пор:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let safeFrame = view.safeAreaLayoutGuide.layoutFrame
    let size = CGSize(width: safeFrame.width, height: safeFrame.height)
    return setCollectionViewItemSize(size: size)

}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.itemSize = setCollectionViewItemSize(size: size)
        layout.invalidateLayout()
    }
}

func setCollectionViewItemSize(size: CGSize) -> CGSize {
    let height: CGFloat = 400
    if UIDevice.current.userInterfaceIdiom == .pad {
        if UIApplication.shared.statusBarOrientation.isPortrait {
            let width = (size.width - 3 * spacing) / 2
            return CGSize(width: width, height: height)
        } else {
            let width = (size.width - 4 * spacing) / 3
            return CGSize(width: width, height: height)
        }

    } else {
        if UIApplication.shared.statusBarOrientation.isPortrait {
            let width = size.width - (2 * spacing)
            return CGSize(width: width, height: height)

        } else {
            let width = (size.width - 3 * spacing) / 2
            return CGSize(width: width, height: height)
        }
    }
}

Приведенный выше код корректно изменяет размер при повороте для большинства iPhone, для которого требуется safeAreaLayoutGuide (то есть Xs, Xr), но не 5 с, 6 с и 6 с плюс.Он также не правильно изменяет размер для iPad.

enter image description here

enter image description here

Я также получаюниже предупреждение, но, как рекомендовано post , я реализовал invalidateLayout (), но по-прежнему не выводит предупреждения и корректно изменяет размер ячеек.

2019-03-13 22:33:08.679440+0800 Snapshotting a view (0x7f8f1a711650, Construction.CollectionCardCell) that has not been rendered at least once requires afterScreenUpdates:YES. 
2019-03-13 22:33:16.375665+0800 The behavior of the UICollectionViewFlowLayout is not defined because: 
2019-03-13 22:33:16.375809+0800 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. 
2019-03-13 22:33:16.376470+0800 The relevant UICollectionViewFlowLayout instance is <UICollectionViewFlowLayout: 0x7f8f1a40eab0>, and it is attached to <UICollectionView: 0x7f8f1a8db600; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x6000017de2e0>; animations = { bounds.origin=<CABasicAnimation: 0x6000019ecc20>; bounds.size=<CABasicAnimation: 0x6000019ecce0>; position=<CABasicAnimation: 0x6000019f2b80>; bounds.origin-2=<CABasicAnimation: 0x6000019f2c40>; bounds.size-2=<CABasicAnimation: 0x6000019f2c80>; }; layer = <CALayer: 0x6000019cfa60>; contentOffset: {0, -64}; contentSize: {568, 1296}; adjustedContentInset: {64, 0, 49, 0}> collection view layout: <UICollectionViewFlowLayout: 0x7f8f1a40eab0>. 
2019-03-13 22:33:16.376574+0800 Make a symbolic breakpoint at UICollectionViewFlowLayoutBreakForInvalidSizes to catch this in the debugger.

Я создал пустой проект для тестирования приведенного выше кода, используя только базовый UICollectionViewCell, но каким-то образом изменил размеры себя правильно.Есть ли что-то, что мне нужно сделать с моим customCollectionViewCells, чтобы заставить его изменить размер или перерисовать себя?

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