Swift UICollectionView iPad Flow Layout не работает - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время возникают некоторые проблемы с макетом потока при использовании представления коллекции на iPad.В настоящее время я занимаюсь разработкой приложения, которое отображает посты в потоковом макете, делая его красивым и гладким.Однако при тестировании приложения на всех устройствах я заметил, что дисплей меняется на:

  • iPad 5-го поколения
  • iPad Air
  • iPad Air 2
  • iPad Pro (9,7 дюйма)

А вот на остальных iPad'ах он отображается правильно.В чем здесь проблема?В настоящее время я использую этот код для стилизации своего макета внутри CollectionView:

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

        switch UIDevice().screenType {
        case .iPhoneX:
            return CGSize(width: 180.0, height: 180.0)
            break
        case .iPhone5:
            return CGSize(width: 152.0, height: 152.0)
            break
        case .iPhone6:
            return CGSize(width: 180.0, height: 180.0)
            break
        case .iPhone6Plus:
            return CGSize(width: 200.0, height: 200.0)
            break
        case .iPad:
            return CGSize(width: 400.0, height: 400.0)
            break
        case .iPadTwo:
            return CGSize(width: 400.0, height: 400.0)
            break
        case .iPadThree:
            return CGSize(width: 400.0, height: 400.0)
            break
        default:
            return CGSize(width: 200.0, height: 200.0)
            break
        }
    }

«iPad Two» и «iPad Three» - это просто перечисления, которые я пытался создать, пытаясь определить тип iPad и, еслиЯ получил вывод на печать некоторого текста (но он просто падает по умолчанию), независимо от iPad.

И это мои размеры экрана:

 switch UIScreen.main.nativeBounds.height {
        case 960:
            return .iPhone4
        case 1136:
            return .iPhone5
        case 1334:
            return .iPhone6
        case 2208:
            return .iPhone6Plus
        case 1024:
            return .iPad
        case 1366:
            return .iPadTwo
        case 834:
            return .iPadThree
        case 2436:
            return .iPhoneX
            break
        default:
            return .unknown
        }

А вот визуальное представлениемоей проблемы, возникающей на перечисленных устройствах, но не на остальных:

Как это должно выглядеть:

This is how it's supposed to look like.

Как это выглядит на перечисленных устройствах:

enter image description here

Я был бы очень признателен за помощь, если кто-то может помочь мне решить эту проблему, так как я не могупохоже, нашел правильное решение.

1 Ответ

0 голосов
/ 24 мая 2018

FYI .Я предлагаю, не устанавливайте Размер CollectionCell в sizeForItemAt indexPath, попробуйте какой-нибудь общий способ.

Вы должны расширить UICollectionViewFlowLayout и создать новый Макет, подобный этому,

class HomeLayout: UICollectionViewFlowLayout {    
    var numberOfItemsPerRow : Int {
        get{
            var value = 0
            if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {
                value = 3
            } else {
                value = 5
            }
            return value
        }
        set {
            self.invalidateLayout()
        }
    }

    override func prepare() {
        super.prepare()
        if self.collectionView != nil {
            var newItemSize = self.itemSize
            let itemsPerRow = max(self.numberOfItemsPerRow, 1)
            let totalSpacing = self.minimumInteritemSpacing * CGFloat(itemsPerRow - 1)
            let newWidth = (self.collectionView!.bounds.size.width - self.sectionInset.left - self.sectionInset.right - totalSpacing) / CGFloat(itemsPerRow)
            newItemSize.width = max(newItemSize.width,newWidth)
            if self.itemSize.height > 0 {
                let aspectRatio: CGFloat = self.itemSize.width / self.itemSize.height
                newItemSize.height = newItemSize.width / aspectRatio
            }
            self.itemSize = newItemSize            
        }
    }
}

Теперь назначьте свой CollectionView's UICollectionViewFlowLayout до HomeLayout от Построителя интерфейса.

enter image description here

Настройте sectionInsets и Min Spacing с Storyboard.

К вашему сведению.Установите numberOfItemsPerRow в HomeLayout соответственно.

...