Avatar
Kishikawa Katsumi 8/7/2019 5:28 AM
https://github.com/kishikawakatsumi/IBPCollectionViewCompositionalLayout iOS 13のCollection View Compositional LayoutsをiOS 12以前でも使えるように再実装したライブラリを書いています。 で、コードの互換性で困っていて(特にSwiftで使う場合)、 理想はDrop-in Replacementで、コードはそのままでiOS 10, 11, 12でも13でも動くのがやりたいです。 Objective-Cだけならなんとなくできそうな気がする、ただSwiftは同じコードだとXcode 11でビルド(iOS 13をBase SDK)したときに「このクラスはiOS 13からしか使えない〜」のチェックに引っかかって if #available() を書かないといけないです。そうすると結局2つのコードベースをメンテするのであまり嬉しくない。(そうは言ってもクラスが違うだけの同じコードになるから格段に楽ではある) 今考えているのはクラスにPrefixを付けて、それで書くようにしてもらって、iOS 13なら標準のAPIを、iOS 12以下ならライブラリのAPIにフォールバックする、という風にしようかと思いますがあまり気に入ってないので
Backport of UICollectionViewCompositionalLayout to earlier iOS 12 - kishikawakatsumi/IBPCollectionViewCompositionalLayout
5:28 AM
もっと良い方法があったら教えてほしいです。
5:30 AM
理想は let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)) let item = NSCollectionLayoutItem(layoutSize: itemSize) let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(44)) let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = NSCollectionLayoutSection(group: group) let layout = UICollectionViewCompositionalLayout(section: section) let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) ... ^ これでiOS 13でも12以前でもうまく動く(iOS 13では標準のAPIを使う)。Xcode 10ならうまく動きそう。Xcode 11でビルドしようとするとダメ。 現在は妥協して以下のように書くようにしようかと考えています。 (edited)
5:30 AM
let itemSize = IBPNSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalHeight(1)) let item = IBPNSCollectionLayoutItem(layoutSize: itemSize) let groupSize = IBPNSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .absolute(44)) let group = IBPNSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) let section = IBPNSCollectionLayoutSection(group: group) let layout = IBPUICollectionViewCompositionalLayout(section: section) let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout) ... IBPプレフィックスをつける。美しくないし、あまり理解してもらえない気がする。