How to refresh UICollectionViewCell in iOS 7?

ios7, uicollectionview, uicollectionviewcell, xcode5

Solution

In iOS 7, you must override isEqual: in your UICollectionViewLayoutAttributes subclass to compare any custom properties that you have.

The default implementation of isEqual: does not compare your custom properties and thus always returns YES, which means that -applyLayoutAttributes: is never called.

Try this:

- (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;
}

Problem

I am trying to develop my app in Xcode 5 and debug it under iOS 7 environment. I have a customized UICollectionViewLayoutAttributes. I plan to do something after long pressing on UICollectionViewCell, so I override the method in UICollectionViewCell.m ``` - (void)applyLayoutAttributes:(MyUICollectionViewLayoutAttributes *)layoutAttributes { [super applyLayoutAttributes:layoutAttributes]; if ([(MyUICollectionViewLayoutAttributes *)layoutAttributes isActived]) { [self startShaking]; } else { [self stopShaking]; } } ``` In iOS 6 or below, - applyLayoutAttributes: is called after I call the statements below. ``` UICollectionViewLayout *layout = (UICollectionViewLayout *)self.collectionView.collectionViewLayout; [layout invalidateLayout]; ``` However, in iOS 7, - applyLayoutAttributes: is NOT being called even if I reload the CollectionView. Is that a bug which is gonna be fixed by Apple later on, or I have to do something?

Original source