8

UICollectionViewusing内のすべてのセルを垂直方向および水平方向に中央揃えにするにはどうすればよいUICollectionViewFlowLayoutですか?

フロー レイアウトでは、スクロール方向に応じて、右または下にスペースが残ります。すべての面に同じパディングを設定したい。のsectionInsetプロパティをいじってみましたUICollectionViewFlowLayout

4

3 に答える 3

5

UICollectionViewDelegateFlowLayoutセルの水平方向と垂直方向のセンタリングを動的に実現するためのプロトコルを実装することをお勧めします。UICollectionViewDelegateFlowLayoutプロトコルリファレンスから:

UICollectionViewDelegateFlowLayoutプロトコルは、UICollectionViewFlowLayoutオブジェクトと調整してグリッドベースのレイアウトを実装できるようにするメソッドを定義します。このプロトコルのメソッドは、グリッド内のアイテムのサイズとアイテム間の間隔を定義します。

このプロトコルのすべてのメソッドはオプションです。特定のメソッドを実装しない場合、フローレイアウトデリゲートは、適切な間隔情報のために独自のプロパティの値を使用します。

フローレイアウトオブジェクトは、コレクションビューのデリゲートオブジェクトがこのプロトコルを採用することを想定しています。したがって、コレクションビューのデリゲートプロパティに割り当てられたオブジェクトにこのプロトコルを実装します。

collectionView:layout:insetForSectionAtIndex:おそらく、のようなものを使用して画面の4つの側面すべてのはめ込みを調整するために使用できる方法に最も興味があるでしょうUIEdgeInsetsMake。対応する画面の寸法(垂直または水平)からセルのサイズなどの適切な量を差し引くことにより、画面のサイズに応じて挿入図を決定できます。次に、2で割って、特定の寸法のインセットを等しくします。

于 2013-03-12T11:32:10.503 に答える
1

セクション インセットを使用しますか?

minimumLineSpacing わかりました、プロパティと minimumInteritemSpacing プロパティで遊んでみてください

最小行間隔

垂直スクロール グリッドの場合、この行間は、連続する行間の最小間隔を表します。水平スクロール グリッドの場合、この値は連続する列間の最小間隔を表します。この間隔は、ヘッダーと最初の行の間、または最終行とフッターの間のスペースには適用されません。

最小アイテム間隔

垂直スクロール グリッドの場合、この間隔は同じ行の項目間の最小間隔を表します。水平スクロール グリッドの場合、この値は同じ列内の項目間の最小間隔を表します。この間隔は、1 行に収まる項目の数を計算するために使用されますが、項目の数が決定された後、実際の間隔が上方に調整される可能性があります。

于 2013-03-12T07:51:21.053 に答える
-1

メソッドをサブクラス化UICollectionViewFlowLayoutし、オーバーライドして、次のlayoutAttributesForElementsInRect:ように調整しますUICollectionViewCells

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {

NSArray* array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;

for(UICollectionViewLayoutAttributes* attributes in array) {

    if(CGRectIntersectsRect(attributes.frame, rect)){

        CGFloat d = UIInterfaceOrientationIsPortrait(_orientation)?
        CGRectGetMidY(visibleRect)-attributes.center.y :
        CGRectGetMidX(visibleRect)-attributes.center.x;

        CGFloat w = visibleRect.size.width;
        CGFloat h = visibleRect.size.height;

        CGFloat dRatio = UIInterfaceOrientationIsPortrait(_orientation)? d/(h/2) : d/(w/2);

        CGFloat angle = MAX_ANGLE*dRatio; // an angle between 0 and MAX_ANGLE based on proximity to center
        CGFloat radians = DEGREES_TO_RADIANS(angle);

        debug = 0;

        CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
        rotationAndPerspectiveTransform.m34 = PERSPECTIVE;

        rotationAndPerspectiveTransform = UIInterfaceOrientationIsPortrait(_orientation)?
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 1.0f, 0.0f, 0.0f) :
        CATransform3DRotate(rotationAndPerspectiveTransform, radians, 0.0f, 1.0f, 0.0f);

        attributes.transform3D = rotationAndPerspectiveTransform;
    }
}

return array;
}

このコードは編集していません。マクロとインスタンス変数への参照があるため、必要に応じて微調整する必要があります。これはカバーフロー スタイルのレイアウトを作成するために使用されましたが、原則は同じですが、3D ビジネスはありません。フロー内の単一の行または列を保証するには、セクション インセットを設定する必要があります。

于 2013-03-12T15:16:56.997 に答える