9

Xcode 5 でアプリを開発し、iOS 7 環境でデバッグしようとしています。

カスタマイズされた UICollectionViewLayoutAttributes があります。

UICollectionViewCellを長押しして何かする予定なので、UICollectionViewCell.mでメソッドをオーバーライドします

- (void)applyLayoutAttributes:(MyUICollectionViewLayoutAttributes *)layoutAttributes
{
    [super applyLayoutAttributes:layoutAttributes];
    if ([(MyUICollectionViewLayoutAttributes *)layoutAttributes isActived])
    {
        [self startShaking];
    }
    else
    {
        [self stopShaking];
    }
}

iOS 6 以下では、以下のステートメントを呼び出した後に- applyLayoutAttributes:が呼び出されます。

UICollectionViewLayout *layout = (UICollectionViewLayout *)self.collectionView.collectionViewLayout;
[layout invalidateLayout];

ただし、iOS 7 では- applyLayoutAttributes: CollectionView をリロードしても呼び出されません。

それは後で Apple によって修正されるバグですか、それとも私が何かしなければなりませんか?

4

3 に答える 3

23

iOS 7 では、UICollectionViewLayoutAttributes サブクラスで isEqual: をオーバーライドして、所有しているカスタム プロパティを比較する必要があります。

isEqual: のデフォルトの実装は、カスタム プロパティを比較しないため、常に YES を返します。これは、-applyLayoutAttributes: が呼び出されないことを意味します。

これを試して:

- (BOOL)isEqual:(id)other {
    if (other == self) {
            return YES;
    }
    if (!other || ![[other class] isEqual:[self class]]) {
            return NO;
    }
    if ([((MyUICollectionViewLayoutAttributes *) other) isActived] != [self isActived]) {
        return NO;
    }

    return YES;
}
于 2013-09-27T16:04:45.587 に答える