Search code examples
gmgridviewgmgridviewcell

GMGridViewCell not shaking


I have used GMGridView inside my app. When I change the orientation all is fine, but if I change it again and enter edit mode all the cells are shacking except the visible one in the lower-right corner. The GmGridView is added as a subview to a controller and it also doesn't occupy the whole screen. I've tried destroying it and recreating it when a rotation notification occurs ... same behaviour. Also I have made a custom view with multiple buttons and labels that I have set as the the GMGridViewCell's contentView.

here's the code for the cellForItemAtIndex

- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index {
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    GMGridViewCell *cell = [gmGridView dequeueReusableCell];

    if (!cell) {
        CGSize cellSize = [self GMGridView:gmGridView sizeForItemsInInterfaceOrientation:orientation];

        cell = [[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, cellSize.width, cellSize.height)];
        cell.deleteButtonIcon = [UIImage imageNamed:@"delete_button"];
        cell.deleteButtonOffset = CGPointMake(0, 0);


    }     

    CustomGridViewCell *gridViewContent = [CustomGridViewCell getNewGridViewCellForOrientation:orientation];
    ContentData *data = [wishlistContentArray objectAtIndex:index];
    [gridViewContent setuprWithContent:data];
    cell.contentView = gridViewContent;

    if (!gridViewContent.delegate)
        gridViewContent.delegate = self;

    return cell;
}

Solution

  • There is a bug on GMGridView when it computes the number of visible cells.

    In loadRequiredItems there are these two lines of code

    NSRange rangeOfPositions = [self.layoutStrategy rangeOfPositionsInBoundsFromOffset: self.contentOffset];
    NSRange loadedPositionsRange = NSMakeRange(self.firstPositionLoaded, self.lastPositionLoaded - self.firstPositionLoaded);
    

    You have to change the range so it will return the smallest number that is a multiple of the number of items on your cell.

    For example if you have 2 cells on a row, right now the code will return a range of {0,5} but it should be {0,6}.