UICollectionViewFlowLayoutは素晴らしいですが、scrollDirectionがレイアウトの方向と異なるように少し調整したいと思います。私が欲しいのは、スプリングボードのホーム画面や左/右にスワイプできる絵文字キーボードですが、セルは左から右、上から下に配置されています(上から下ではなく、左から右に配置されています)。 scrollDirectionをhorizontalに設定したUICollectionViewFlowLayoutを使用)。FlowLayoutを簡単にサブクラス化してこの変更を行う方法を知っている人はいますか?UICollectionViewFlowLayoutオブジェクトのscrollDirectionに加えてlayoutDirectionがないことに失望しています:(
@rdelmar私はあなたのソリューションに似たものを実装しましたが、それは機能します(私が望むほどエレガントではありません)が、再描画しない限りコレクションからアイテムが消えることがあることに気付きました。そのため、答えを受け入れませんでした。これが私が最終的に得たものです:
@interface UICollectionViewPagedFlowLayout : UICollectionViewFlowLayout
@property int width;
@property int height;
@end
@implementation UICollectionViewPagedFlowLayout
#warning MINOR BUG: sometimes symbols disappear
- (CGSize)collectionViewContentSize {
CGSize size = [super collectionViewContentSize];
// make sure it's wide enough to cover all the objects
size.width = self.collectionView.bounds.size.width * [self.collectionView numberOfSections];
return size;
}
- (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)) {
// see which section this is in
CGRect configurableRect = UIEdgeInsetsInsetRect(visibleRect, self.sectionInset);
int horizontalIndex = attributes.indexPath.row % self.width;
int verticalIndex = attributes.indexPath.row / self.width;
double xspace = (configurableRect.size.width - self.width * self.itemSize.width) / self.width;
double yspace = (configurableRect.size.height - self.height * self.itemSize.height) / self.height;
attributes.center = CGPointMake(attributes.indexPath.section * visibleRect.size.width + self.sectionInset.left + (self.itemSize.width + xspace) * horizontalIndex + self.itemSize.width / 2, self.sectionInset.top + (self.itemSize.height + yspace) * verticalIndex + self.itemSize.height / 2);
}
}
return array;
}
@end