8

プリセット、

私はcollectionViewFlowLayoutサブクラスを持っています

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
   }

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *arr = [super layoutAttributesForElementsInRect:rect];
    BBLog(@"ARRA:%@", arr);
    for (UICollectionViewLayoutAttributes *attr in arr) {
        if (CGAffineTransformIsIdentity(attr.transform)) {
            attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
        }
    }

    return arr;
}

CollectionViewを回転させて逆さまにスクロール

 self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);

ただし、サブクラス化せずにネイティブ collectionViewFlowLayout を使用しても、git this エラー

問題

チャットに 2 件以上のメッセージがありますが、一番下 (通常は一番上) にスクロールすると 2 番目の項目が消えます。

指定された rect の layoutAttributesForElementsInRect は、2 つの indexPath 0-0 と 0-1 の 2 つの属性を返しますが、デリゲート メソッド

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

indexPath 0-0 に対してのみ呼び出されます

画像はこちら

トップスクロール ここに画像の説明を入力

更新 なぜそれが起こるのかを見つけました-この行コード

attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);

変換を削除するかどうかを確認します

ここに画像の説明を入力

4

2 に答える 2

0

申し訳ありませんが、理由を見つけて回避しました。

これは、シミュレーターではなくデバイスでのみ発生します

3 つの CGRect を見てください

iPhone5S

(CGRect) oldFrame = (origin = (x = -0.000000000000056843418860808015, y = 0), size = (width = 320.00000000000006, height = 314.00000000000006))

iPhone5C

(CGRect) oldFrame = (原点 = (x = 0, y = 0), サイズ = (幅 = 320, 高さ = 314))

シミュレータ インテル コア

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314))

それらのすべてに、次の方法で回転変換を適用します

CGAffineTransformMakeRotation((CGFloat)M_PI)

まずはiPhone 5S ARM Apple A7 CPU

次に、iPhone 5C ARM Apple A6 CPU上にあります。

3 つ目は、Intel Core iX プロセッサのシミュレータです。

だから、私の回避策は次のとおりです。

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

    if (CGAffineTransformIsIdentity(retAttr.transform)) {
        retAttr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI);
    }

    CGRect oldFrame = retAttr.frame;

    oldFrame.origin.x = retAttr.frame.origin.x > 0 ?: 0;

    retAttr.frame = oldFrame;

    return retAttr;
}
于 2016-02-03T11:03:19.830 に答える