Размер UICollectionViewCell для всех ячеек при повороте устройства

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

PS Размер ячейки представления коллекции должен быть размером всего экрана.

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)
}

Что вы написали в sizeForItemAtIndexPath?

iPeter 08.03.2019 08:35

Можешь поделиться скриншотами?

Pooja Kamath 08.03.2019 08:42

Я добавил свой вопрос @iPeter

Burak Nurçiçek 08.03.2019 08:51

Хорошо. Проверка.

iPeter 08.03.2019 08:52

Какое направление прокрутки вы хотите? Горизонтальный или вертикальный?

iPeter 08.03.2019 08:54

горизонтальный @iPeter

Burak Nurçiçek 08.03.2019 08:55

Вы хотите пространство между ячейками?

iPeter 08.03.2019 08:56

@iPeter Я обновил свой последний код, братан. Нет, мой collectionviewcell - это весь экран, как история в Instagram. Я разрабатываю тот же сценарий для другого проекта. Пользователь прокручивает по горизонтали и проводит пальцем по другой целой ячейке экрана.

Burak Nurçiçek 08.03.2019 09:01

willTransition можете убрать, на мой взгляд он не понадобится.

iPeter 08.03.2019 09:06

Как насчет использования AutoLayout вместо CGSizes? developer.apple.com/library/archive/documentation/…

Ling Vu 08.03.2019 09:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
113
3

Ответы 3

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

да, они 0. Можете ли вы проверить мои последние блоки кода?

Burak Nurçiçek 08.03.2019 09:07

Удалить метод willTransition.

iPeter 08.03.2019 09:08

а внутри sizeForItemAtIndexPath просто напишите return CGSize(width: view.frame.size.width, height: view.frame.size.height).

iPeter 08.03.2019 09:10

Больше ничего не нужно.

iPeter 08.03.2019 09:10

Я удалил и обновил. Но это все еще не работает, братан. Когда я прокручиваю до следующей ячейки и поворачиваю устройство, в представлении коллекции снова отображаются две ячейки. Это конфиденциально, братан, нет возможности показать мой код, извините

Burak Nurçiçek 08.03.2019 09:12

Вы удалили invalidateLayout?

iPeter 08.03.2019 09:13

У вас есть идеи?

Burak Nurçiçek 08.03.2019 09:18

Я не могу этого сделать, братан. Это конфиденциально

Burak Nurçiçek 08.03.2019 10:52

вы должны написать свой код в 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()
}

Удалите публичное переопределение func willTransition(to newCollection: UITraitCollection, с координатором: UIViewControllerTransitionCoordinator) и func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> метод CGSize и установите только свой размер в viewWillLayoutSubViews, как я упоминал выше

D.Poojara 08.03.2019 12:28

это было так ужасно

Burak Nurçiçek 08.03.2019 12:31

Скриншоты ставить можно? так что лучше понять, как это на самом деле работает

D.Poojara 08.03.2019 12:34

Ok. Установите оба значения на 0 в Min Spacing of storybord->Collectionview->SizeInspector

D.Poojara 08.03.2019 12:43

Я думаю, вы упустили возможность установить для X позиции Collectionview и содержимого ячейки значение 0 и установить режим содержимого изображения изображения для масштабирования для заполнения или заполнения сторон

D.Poojara 08.03.2019 12:51

Как я могу это сделать ?

Burak Nurçiçek 08.03.2019 13:28

раскадровка-> Imageview-> AttributeInspector (вверху справа) -> режим содержимого (здесь измените режим на масштабирование для заполнения или заполнения аспекта)

D.Poojara 08.03.2019 13:35

Нет. В indexpath 0, когда я поворачиваю устройство, представление коллекции работает правильно. Но когда я перехожу к indexpath 1, в представлении коллекции отображается 2 ячейки. вот собственно моя проблема

Burak Nurçiçek 08.03.2019 13:42

Затем вы должны поделиться своим кодом, если это возможно, потому что в моем коде он работал нормально.

D.Poojara 08.03.2019 13:47

какой у тебя скайп братан

Burak Nurçiçek 08.03.2019 13:55

Я не пользуюсь скайпом. Если у вас нет проблем, отправьте его на мою почту [email protected]

D.Poojara 08.03.2019 14:09

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

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()
    }
}

Как я уже говорил, этот код работает с первой ячейкой collectionview. Когда я перехожу ко второй ячейке, в представлении коллекции отображаются две ячейки. это моя проблема

Burak Nurçiçek 11.03.2019 08:16

Не могли бы вы выложить изображение клетки

Bhavesh.iosDev 11.03.2019 08:19

не могли бы вы проверить вызов метода CollectionView sizeForItemAt после того, как вы пролистнете первую ячейку, а также распечатаете размер View в этом методе.

Bhavesh.iosDev 11.03.2019 08:44

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { print("collectionViewLayout: ширина (view.frame.width), высота: (view.frame.height)") return CGSize( width: view.frame.width, height: view.frame.height) } Сейчас я работаю на iphone 8. Когда я в портретном режиме, он печатает ширину 375,0, высоту: 667,0, когда я в ландшафтном режиме ширина 667,0, высота : 375,0

Burak Nurçiçek 11.03.2019 08:55

Другие вопросы по теме