web-dev-qa-db-ja.com

双方向でスクロールするUICollectionView

縦スクロールでUICollectionViewを作りました。

セルの幅は画面の幅よりも大きいため、customFlowLayoutレイアウトに基づいてUICollectionViewFlowを作成し、適切に計算されたコンテンツサイズを返しました。

ただし、これは機能しません。セルの幅が画面の幅よりも小さい場合に機能します。垂直スクロールでは、画面の幅を超える幅を設定できないということですか?

横スクロールでも同じですが、CollectionViewの高さは画面の高さに制限されます。

それを機能させる方法はありますか?

20
last-Programmer

他の人がすでに述べたように、UICollectionViewはフローレイアウトを使用して一方向にしかスクロールできません。ただし、カスタムレイアウトを作成したり、サードパーティのライブラリを使用したりせずに、これを非常に簡単に行うことができます。

ビューをストーリーボードに配置する場合、UICollectionViewUIScrollViewに埋め込むことができます。 scrollviewを水平にスクロールするように設定し、UICollectionViewを垂直にスクロールするように設定します。次に、UICollectionView.delaysContentTouchesto trueなので、タッチはUIScrollViewに渡され、コレクションビューをスクロールしようとしているとは思われません。

UICollectionViewを設定するときは、そのサイズとセルのサイズを実際に必要なサイズ(実際の画面よりも広い)に設定し、それに応じてレイアウトします。

今度は、包含UIViewControllerに、このコードをビューのライフサイクルに入れます。

    - (void)viewDidLayoutSubviews {
        self.myScrollView.contentSize = self.myCollectionView.frame.size;
    }

文字通り、あなたが説明していることを達成するためにあなたがしなければならないすべてです。これで、scrollviewを使用して水平方向にスクロールしてセル全体を表示でき、collectionViewはセル全体を垂直方向にスクロールできるようになります。

ハッピープログラミング。

13
johnrechd

私はこれを見つけました ICollectionView:水平および垂直スクロールをサポートするUICollectionViewLayoutを定義する方法?

jiruneによって提供された例が重要なようです。しかし、行のセクションの代わりにcollectionview行を使用することが可能であれば、それはいいでしょう。

3
rbmanian75

Xcode 11 +、Swift 5。

私は問題を解決しました videocode を準備しました

0
Ahmed Abdallah

私はあなたの問題を理解したかわかりません。

ただし、カスタムレイアウトを作成した場合は、実装済みであることを確認してください。

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;

また、レイアウト属性のフレームとサイズには、「ラージセル」インデックスパスの正しい値が設定されています。

また、実装したことを確認してください:

- (CGSize) collectionViewContentSize;

このメソッドは、コレクションビューのcontentSizeを返します。 contentSize.width> youAppFrame.widthの場合、水平スクロールが必要です。高さと垂直スクロールについても同じです。

また、collectionViewがスクロールを許可し、レイアウトが以下を使用して正しく準備されていることを確認してください。

- (void)prepareLayout

ところで、あなたのレイアウトではUICollectionViewLayoutまたはUICollectionViewFlowLayoutをオーバーロードしていますか?

0

その前に、異なるタイプのレイアウトを使用する必要があります。フローレイアウトは、その項目をリストとして表し、使用可能な幅に基づいてこれらの項目をセルに広げます。水平スクロールと垂直スクロールの両方が必要な場合は、グリッドの列数を何らかの方法で指定する必要があります。 FlowLayoutにはそれがありません。簡単な解決策は、UICollectionViewLayoutのサブクラスを作成し、collectionViewContentSizeをオーバーライドして、width = 1行のセル幅の追加された合計に追加することです(これは、必要な列の数を知る必要がある場所です)。それら。セルがグリッドと同じように列ごとに同じサイズである場合、これは正常に機能します。

0
Radu Simionescu