iOS - UICollectionView spacing still there when set to 0 - How to set with no spacing between cells

前端 未结 6 1419
南旧
南旧 2020-12-16 12:03

I have a simple UICollectionView which I have set with 0 spacing in InterfaceBuilder but when I populate the collection view with cells there is still some spacing. Is there

相关标签:
6条回答
  • 2020-12-16 12:19

    The documentation for [UICollectionViewFlowLayout minimumInteritemSpacing] mentions:

    This spacing is used to compute how many items can fit in a single line, but after the number of items is determined, the actual spacing may possibly be adjusted upward.

    You may need to implement a custom layout to do this. The documentation can be found here, and an example here.

    0 讨论(0)
  • 2020-12-16 12:23

    I solved this issue and got the layout I desired with the following:

    - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    
    
    
        cell.backgroundColor = [UIColor clearColor];
    
        //clear any contents on the cell
        for (UIView *subView in [cell subviews]) {
        [subView removeFromSuperview];
        }
    
    
        //Label to put on the cell
        UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(2, 2, cell.frame.size.width -4, cell.frame.size.height -4)];
        lbl.backgroundColor = [UIColor clearColor];
        lbl.textColor = [UIColor colorWithRed:[CPExtras RGBtoPercent:70] green:[CPExtras RGBtoPercent:92] blue:[CPExtras RGBtoPercent:105] alpha:1];
        lbl.font = [UIFont boldSystemFontOfSize:20];
        lbl.text = @"100";
        lbl.textAlignment = NSTextAlignmentCenter;
    
        //Give the cell a border
        cell.layer.borderColor = [[UIColor colorWithRed:[CPExtras RGBtoPercent:70] green:[CPExtras RGBtoPercent:92] blue:[CPExtras RGBtoPercent:105] alpha:0.5] CGColor];
        cell.layer.borderWidth = 0.5;
    
    
        [cell addSubview:lbl];
    
        [lbl release];
    
    
    
    
    
    return cell;
    }
    

    In IB I had these measurement settings for the collectionview:

    Collection View size

    Collection view flow layout size

    0 讨论(0)
  • 2020-12-16 12:29

    In order to actually have zero space, the number of cells and their width should be divisible by the collection view's own width, for example if you have 5 cells at a time with a width of 100px, then your collection view should have 500px in width, if it's larger then it will force a space between cells.

    0 讨论(0)
  • 2020-12-16 12:38

    Simple solution for your Query. Add this in your viewController's .m file:

    -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
        ProductDetailViewController *HomeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"ProductDetailView"];
        HomeVC.title = @"DemoProject";
        [self.navigationController pushViewController:HomeVC animated:YES];
    }
    
    - (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
        return UIEdgeInsetsMake(0, 0, 0, 0); // top, left, bottom, right
    }
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    
        return 0.0;
    }
    
    - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
        return 0.0;
    }
    
    0 讨论(0)
  • 2020-12-16 12:40

    Swift 3 version of @MihirOza 's solution

    Worked for both Horizontal and Vertical collection views

    Code

    // removing spacing
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0.0
    }
    
    0 讨论(0)
  • 2020-12-16 12:45

    You have to create custom UICollectionViewLayout.

    Space between the cells will be equal to cellSpacing.

    final class CustomFlowLayout: UICollectionViewFlowLayout {
    
        let cellSpacing: CGFloat = 0
    
        override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
            if let attributes = super.layoutAttributesForElements(in: rect) {
                for (index, attribute) in attributes.enumerated() {
                    if index == 0 { continue }
                    let prevLayoutAttributes = attributes[index - 1]
                    let origin = prevLayoutAttributes.frame.maxX
                    if (origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize.width) {
                        attribute.frame.origin.x = origin + cellSpacing
                    }
                }
                return attributes
            }
            return nil
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题