セットアップしたUICollectionViewがあり、すべてが正常に機能します(選択、ヘッダーなど)が、状況によってはスクロール方向を変更したい場合があります。
つまり、ストーリーボードに移動してscrollDirectionを変更すると、正常に機能しますが、プログラムで実行したいと思います。
コレクションビューのスクロール方向を次のようなもので直接変更しようとしました
[myCollectionView setScrollDirection:....and so on.......
しかし、これは機能しません。scrollDirectionなどが見つかりません。
フローレイアウトも設定しようとしましたが、これは間違っていると確信しています(つまり、ViewLayoutをFlowLayoutに設定しようとしています)。
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
[myCollectionView setCollectionViewLayout:flowLayout];
これは多くの制約の問題でクラッシュし、flowLayoutでさらに多くの作業を行う必要があると思います(私が見つけたところ、今は少し上にあります)。
カスタムセル、ヘッダー、フッターを使用していることにも注意してください。
要するに、これを行う簡単な方法はありますか? OR誰かが良いフローレイアウトチュートリアルを知っていますか?
編集
コレクションビューをそのように設定します。
[myCollectionView setDataSource:self];
[myCollectionView setDelegate:self];
私はこれらのデリゲートメソッドを実装し、すべて正常に動作します
viewForSupplementaryElementOfKind
numberOfSectionsInCollectionView
numberOfItemsInSection
cellForItemAtIndexPath
didSelectItemAtIndexPath
DataSourceとDelegateを.hとFlowLayoutデリゲートに追加しましたが、後者にも何を含めるべきかわかりません。
視覚的なレイアウトのほとんどはストーリーボードで行われます。フォント、サイズ、色など、プログラムで行うことがいくつかあります。
別の編集
これは、FlowLayoutを変更しようとしたときにエラーになります。また、レイアウトを無効にしようとしたときにも発生します。
制約を同時に満たすことができません。おそらく、次のリストの制約の少なくとも1つは不要なものです。これを試してください:(1)各制約を見て、予期しないものを見つけ出してください。 (2)不要な制約を追加したコードを見つけて、修正します。 (注:理解できないNSAutoresizingMaskLayoutConstraintsが表示されている場合は、UIViewプロパティのドキュメントを参照してください。translatesAutoresizingMaskIntoConstraints)
"<NSAutoresizingMaskLayoutConstraint:0x89967f0 h=--& v=--& V:[menuCell:0x8991700(50)]>",
"<NSLayoutConstraint:0x8991200 menuCell:0x8991700.bottom == UILabel:0x8992be0.bottom + 100>",
"<NSLayoutConstraint:0x898fd50 UILabel:0x8992be0.top == menuCell:0x8991700.top + 3>"
制約を破って回復を試みます
Objc_exception_throwを中断して、デバッガーでこれをキャッチします。にリストされているUIViewのUIConstraintBasedLayoutDebuggingカテゴリのメソッドも役立つ場合があります。
次のように、コレクションビューでinvalidateLayoutを呼び出してみてください。
[myCollectionView.collectionViewLayout invalidateLayout];
これにより、コレクションビューはその時点でレイアウトを更新します( Appleドキュメントはこちら を参照)。確かではありませんが、これが呼び出されるとは思いません。スクロール方向を変更したとき。
それがあなたをどこかに近づけるかどうか見てください!
これを行う:
- (IBAction)changeDirection:(UIButton *)sender
{
UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
{
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
}
else
{
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}
}
わたしにはできる。
Swiftでこれを行うことができます:
//From the collection view subclass
if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
layout.scrollDirection = .Vertical
}
プロパティオブザーバーでそれを行うことができますdidSet{}
コレクションビューアウトレットを使用します。
CollectionViewのアウトレットがmyCollectionViewであると仮定すると、コードでdidSet
プロパティオブザーバーをアウトレットに追加し、レイアウトの方向を変更します。何かのようなもの-
@IBOutlet weak var myCollectionView:UICollectionView!{
didSet{
let layout = contentCollectionView.collectionViewLayout as!
UICollectionViewFlowLayout
layout.scrollDirection = .Vertical
}
}
通常、collectionViewはオブジェクトライブラリからストーリーボードにドロップされ、FlowLayoutが自動的に付属します。このレイアウトの流れの方向を変更するには、コレクションビューを取得するときに、レイアウトのスクロール方向を水平または垂直にするようにコードに指示します。