UICollectionViewCell размер, чтобы соответствовать всем ячейкам при вращении устройства - PullRequest
0 голосов
/ 08 марта 2019

У меня есть пейджер на весь экран.Когда устройство вращается, первая ячейка коллекционного вида подходит для коллекционного вида в альбомном и портретном режимах.Но когда я прокручиваю следующую ячейку в представлении коллекции, она показывает две ячейки.И это не подходит для всего экрана.Как я могу подогнать размер всех ячеек под коллекцию, хотя я прокручиваю коллекцию и поворачиваю ее.Я пытался инвалидомLayout () и много способов.Но я не мог достичь.Только я хочу, чтобы collectionviewcell в любой ситуации помещался на весь экран, хотя прокручивайте и поворачивайте.

PS Размер collectionviewcell должен быть целым размером экрана.

public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.current.orientation.isLandscape,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.height
        layout.itemSize = CGSize(width: width, height: UIScreen.main.bounds.width)
        layout.invalidateLayout()
    } else if UIDevice.current.orientation.isPortrait,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.width
        layout.itemSize = CGSize(width: width , height:  UIScreen.main.bounds.height)
        layout.invalidateLayout()
    }
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let width = view.frame.size.width
    return CGSize(width: width , height: UIScreen.main.bounds.height)
}

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Вы должны написать свой код в viewWillLayoutSubviews ().Вот так

переопределить функцию viewWillLayoutSubviews () {super.viewWillLayoutSubviews ()

    guard let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else {
        return
    }



    if UIDevice.current.orientation == .landscapeLeft
    {
        flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 500)
    }
    else if UIDevice.current.orientation == .landscapeRight
    {
        flowLayout.itemSize = CGSize(width: self.view.frame.width, height: 500)
    }

    flowLayout.invalidateLayout()
}
0 голосов
/ 09 марта 2019

можете ли вы попытаться применить следующий подход.

1-й подход

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

   super.viewWillTransition(to: size, with: coordinator)

   // YOUR CODE OR FUNCTIONS CALL HERE

}

2-й подход

override func viewDidLoad() {
    super.viewDidLoad()        

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.rotated), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)
}

deinit {
     NotificationCenter.default.removeObserver(self)
}

func rotated() {
    if UIDevice.current.orientation.isLandscape,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.height
        layout.itemSize = CGSize(width: width, height: UIScreen.main.bounds.width)
        layout.invalidateLayout()
    } else if UIDevice.current.orientation.isPortrait,
        let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let width = view.frame.width
        layout.itemSize = CGSize(width: width , height:  UIScreen.main.bounds.height)
        layout.invalidateLayout()
    }
}
0 голосов
/ 08 марта 2019

Убедитесь, что расстояние между ячейками убрано, как показано ниже.Это решит вашу проблему.

enter image description here

...