19

setLayout:animatedを呼び出してUICollectionView2 つのレイアウトを切り替えると、現在表示されているセルがzIndexで設定されているレイアウト属性に準拠していないことに気付きましたlayoutAttributesForItemAtIndexPath:

たとえば、UICollectionViewwithがある場合、セルが重なるように負UICollectionViewFlowLayoutの数に設定し、各セルに a を前のセルよりも高く設定すると、セルが下から上に積み上げられているように見えます。minimumLineSpacingzIndex

ただし、レイアウトを別のレイアウトに設定してから元のレイアウトに戻すと、これが壊れます。現在表示されているセルが zIndex をリッスンせず、他のセルの上に配置されているかのようです。セルを画面外にスクロールすると、正しい場所に戻ります。

4

7 に答える 7

11

私も同じ問題を抱えています。レイアウトを切り替えると、セルのzIndexは無視されます。

次のようにz軸に平行移動を適用することで、「正しく見える」ようにできました。

attributes.transform3D = CATransform3DMakeTranslation(0, 0, indexPath.row);

ただし、これは視覚的な修正にすぎません。アイテムをクリックしようとすると、画面外にスクロールして再利用されるまで、zIndexがまだ間違っていることがわかります。

于 2012-10-09T08:28:48.760 に答える
8

Grimfrog と Charlie Elliott の応答を組み合わせて使用​​することで、私が求めている動作を得ることができました。

Charlie Elliott のソリューションは、コレクション ビュー内のアイテムに対して正しい最終結果を得ましたが、アニメーション中に zIndex にまだスナップ効果がありました。

grimfrog のソリューションは正しい外観を提供しましたが、正しいように見えても、レイアウトの変更後も zIndex が正しくないという問題がありました。

この 2 つの組み合わせは、優れたソリューションではありませんが、機能し、UICollectionViewLayoutAttributes のサポートされている変換および zIndex プロパティを使用します。

私のレイアウトでは、

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
  NSArray *attributes = [super layoutAttributesForElementsInRect:rect];

  [attributes enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes *attributes, NSUInteger idx, BOOL *stop) {
    attributes.zIndex = attributes.indexPath.item + 1;
  }];

  return attributes;
}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
  UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath];

  attributes.transform3D = CATransform3DMakeTranslation(0, 0, attributes.indexPath.item);
  return attributes;
}

これを解決する別の方法があるに違いないと確信しているので、まだこれを正しい答えにはしませんが、これが他の人の問題も解決するかどうかに興味があります。

于 2012-10-11T06:20:33.130 に答える
7

試す:

// In UICollectionViewCell subclass
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
    [super applyLayoutAttributes:layoutAttributes];
    // Setting zPosition instead of relaying on
    // UICollectionView zIndex management 'fixes' the issue
    self.layer.zPosition = layoutAttributes.zIndex;
}
于 2016-10-13T02:09:52.930 に答える
4

これも私を噛みました。UICollectionViewいくつかのテストの後、z インデックスに関係なく、選択したセルが強制的に上に表示されることに気付きました。

于 2012-10-11T09:51:26.840 に答える
2

z-index を次のように設定してみてください。

- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath;
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath;
于 2012-10-05T22:19:20.873 に答える