Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UICollectionView interactive transition throwing exception

I'm trying to implement pinch-to-expand on a UICollectionView and am running into some trouble. Unlike all the sample code I can find, I'm not doing this as part of an interactive UINavigationController transition - I just need to expand an item in-place.

Here's my pinch gesture recognizer:

- (void)pinchGestureDidPinch:(UIPinchGestureRecognizer *)recognizer
{
    CGFloat targetScale = 3.0;
    CGFloat scale = recognizer.scale;
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        CGPoint point = [recognizer locationInView:self.collectionView];
        NSIndexPath *rowUnder = [self.collectionView indexPathForItemAtPoint:point];
        self.pinchingRow = [NSIndexPath indexPathForItem:0 inSection:rowUnder.section];
        self.currentState = HACStreamViewControllerTransitioning;
        self.expandedLayout.expandedSection = self.pinchingRow.section;
        self.transitionLayout = [self.collectionView startInteractiveTransitionToCollectionViewLayout:self.expandedLayout completion:nil];
    } else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled) {
        if (scale >= targetScale) {
            [self.collectionView finishInteractiveTransition];
            self.currentState = HACStreamViewControllerExpanded;
        } else {
            [self.collectionView cancelInteractiveTransition];
            self.currentState = HACStreamViewControllerCollapsed;
        }
    } else {
        // change
        CGFloat progress = MIN(targetScale / scale, 1.0);
        progress = MAX(0.0, progress);
        self.transitionLayout.transitionProgress = progress;
        [self.transitionLayout invalidateLayout];
    }
}

Calling startInteractiveTransitionToCollectionViewLayout: causes an exception though:

0   ???                                 0x0fcf577f 0x0 + 265246591,
1   UIKit                               0x01e1f582 -[UICollectionViewTransitionLayout setTransitionProgress:] + 643,
2   UIKit                               0x01d13053 -[UICollectionView _setCollectionViewLayout:animated:isInteractive:completion:] + 658,
3   UIKit                               0x01d12be8 -[UICollectionView setCollectionViewLayout:] + 225,
4   UIKit                               0x01d15e0a -[UICollectionView startInteractiveTransitionToCollectionViewLayout:completion:] + 821,
5   HAW Couples                         0x0001beae -[HACStreamViewController pinchGestureDidPinch:] + 782,
6   UIKit                               0x01a74f8c _UIGestureRecognizerSendActions + 230,
7   UIKit                               0x01a73c00 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 383,
8   UIKit                               0x01a7566d -[UIGestureRecognizer _delayedUpdateGesture] + 60,
9   UIKit                               0x01a78bcd ___UIGestureRecognizerUpdate_block_invoke + 57,
10  UIKit                               0x01a78b4e _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317,
11  UIKit                               0x01a6f248 _UIGestureRecognizerUpdate + 199,
12  UIKit                               0x0173bd4a -[UIWindow _sendGesturesForEvent:] + 1291,
13  UIKit                               0x0173cc6a -[UIWindow sendEvent:] + 1030,
14  UIKit                               0x01710a36 -[UIApplication sendEvent:] + 242,
15  UIKit                               0x016fad9f _UIApplicationHandleEventQueue + 11421,
16  CoreFoundation                      0x033988af __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15,
17  CoreFoundation                      0x0339823b __CFRunLoopDoSources0 + 235,
18  CoreFoundation                      0x033b530e __CFRunLoopRun + 910,
19  CoreFoundation                      0x033b4b33 CFRunLoopRunSpecific + 467,
20  CoreFoundation                      0x033b494b CFRunLoopRunInMode + 123,
21  GraphicsServices                    0x042619d7 GSEventRunModal + 192,
22  GraphicsServices                    0x042617fe GSEventRun + 104,
23  UIKit                               0x016fd94b UIApplicationMain + 1225,
24  HAW Couples                         0x0000eefd main + 141,
25  libdyld.dylib                       0x03bd5725 start + 0

The message on the exception:

*** setObjectForKey: object cannot be nil (key: actualAttribute)

I've verified that my "destination" UICollectionViewLayout is good. The following alternative (triggered by a tap) works fine, and animates as expected:

[self.collectionView setCollectionViewLayout:self.expandedLayout animated:YES completion:^(BOOL finished) {
}];
like image 905
Jerry Wong Avatar asked Oct 02 '22 16:10

Jerry Wong


1 Answers

I have exactly same problem, and in my case, this crash occurs when one of the layout is custom layout and the other one is UICollectionViewFlowLayout. I am still looking into this issue, but I was wondering if you have the same settings.

Edit 1) In my custom layout, I had a decoration view and I returned UICollectionViewLayoutAttributes for the decoration view in [UICollectionViewLayout layoutAttributesForElementsInRect:] operation. I tested after removing layout attributes for decoration view and now it works perfectly. Decoration View in one layout that does not exist in the other layout seems to be an issue, and I will update my answer when I figure out more info.

like image 60
JYC Avatar answered Oct 23 '22 04:10

JYC