web-dev-qa-db-ja.com

UICollectionViewのスクロール方向を変更します

セットアップした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カテゴリのメソッドも役立つ場合があります。

11
Recycled Steel

次のように、コレクションビューでinvalidateLayoutを呼び出してみてください。

[myCollectionView.collectionViewLayout invalidateLayout];

これにより、コレクションビューはその時点でレイアウトを更新します( Appleドキュメントはこちら を参照)。確かではありませんが、これが呼び出されるとは思いません。スクロール方向を変更したとき。

それがあなたをどこかに近づけるかどうか見てください!

0
Matthew Hallatt

これを行う:

- (IBAction)changeDirection:(UIButton *)sender
{
     UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout];
     if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal)
     {
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
     }
     else
     {
         layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
     }
}

わたしにはできる。

20
Pratham Mehta

Swiftでこれを行うことができます:

//From the collection view subclass
    if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.scrollDirection = .Vertical
    }
5
prolfe

プロパティオブザーバーでそれを行うことができますdidSet{}コレクションビューアウトレットを使用します。

CollectionViewのアウトレットがmyCollectionViewであると仮定すると、コードでdidSetプロパティオブザーバーをアウトレットに追加し、レイアウトの方向を変更します。何かのようなもの-

@IBOutlet weak var myCollectionView:UICollectionView!{
      didSet{
            let layout = contentCollectionView.collectionViewLayout as!
UICollectionViewFlowLayout
            layout.scrollDirection = .Vertical
        }
}

通常、collectionViewはオブジェクトライブラリからストーリーボードにドロップされ、FlowLayoutが自動的に付属します。このレイアウトの流れの方向を変更するには、コレクションビューを取得するときに、レイアウトのスクロール方向を水平または垂直にするようにコードに指示します。

0
Natasha