У меня есть пейджер на весь экран. При повороте устройства первая ячейка представления коллекции соответствует представлению коллекции в альбомном и портретном режимах. Но когда я прокручиваю следующую ячейку в представлении коллекции, она показывает две ячейки. И это не подходит для всего экрана. Как я могу подогнать размер всех ячеек к представлению коллекции, хотя я прокручиваю представление коллекции и поворачиваю. Я пробовал 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)
}
Можешь поделиться скриншотами?
Я добавил свой вопрос @iPeter
Хорошо. Проверка.
Какое направление прокрутки вы хотите? Горизонтальный или вертикальный?
горизонтальный @iPeter
Вы хотите пространство между ячейками?
@iPeter Я обновил свой последний код, братан. Нет, мой collectionviewcell - это весь экран, как история в Instagram. Я разрабатываю тот же сценарий для другого проекта. Пользователь прокручивает по горизонтали и проводит пальцем по другой целой ячейке экрана.
willTransition можете убрать, на мой взгляд он не понадобится.
Как насчет использования AutoLayout вместо CGSizes? developer.apple.com/library/archive/documentation/…





Обязательно удалите интервалы между ячейками, как показано ниже. Это решит вашу проблему.
да, они 0. Можете ли вы проверить мои последние блоки кода?
Удалить метод willTransition.
а внутри sizeForItemAtIndexPath просто напишите return CGSize(width: view.frame.size.width, height: view.frame.size.height).
Больше ничего не нужно.
Я удалил и обновил. Но это все еще не работает, братан. Когда я прокручиваю до следующей ячейки и поворачиваю устройство, в представлении коллекции снова отображаются две ячейки. Это конфиденциально, братан, нет возможности показать мой код, извините
Вы удалили invalidateLayout?
У вас есть идеи?
Я не могу этого сделать, братан. Это конфиденциально
вы должны написать свой код в 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, как я упоминал выше
это было так ужасно
Скриншоты ставить можно? так что лучше понять, как это на самом деле работает
Ok. Установите оба значения на 0 в Min Spacing of storybord->Collectionview->SizeInspector
Я думаю, вы упустили возможность установить для X позиции Collectionview и содержимого ячейки значение 0 и установить режим содержимого изображения изображения для масштабирования для заполнения или заполнения сторон
Как я могу это сделать ?
раскадровка-> Imageview-> AttributeInspector (вверху справа) -> режим содержимого (здесь измените режим на масштабирование для заполнения или заполнения аспекта)
Нет. В indexpath 0, когда я поворачиваю устройство, представление коллекции работает правильно. Но когда я перехожу к indexpath 1, в представлении коллекции отображается 2 ячейки. вот собственно моя проблема
Затем вы должны поделиться своим кодом, если это возможно, потому что в моем коде он работал нормально.
какой у тебя скайп братан
Я не пользуюсь скайпом. Если у вас нет проблем, отправьте его на мою почту [email protected]
Вы можете попробовать применить следующий подход.
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. Когда я перехожу ко второй ячейке, в представлении коллекции отображаются две ячейки. это моя проблема
Не могли бы вы выложить изображение клетки
не могли бы вы проверить вызов метода CollectionView sizeForItemAt после того, как вы пролистнете первую ячейку, а также распечатаете размер View в этом методе.
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
Что вы написали в
sizeForItemAtIndexPath?