web-dev-qa-db-fra.com

iOS - uicollectionview espacement toujours là-bas quand défini sur 0 - Comment définir sans espacement entre les cellules

J'ai un simple uicollectionview que j'ai défini avec 0 espacement dans InterfaceBuilder, mais lorsque je peuplé la vue de la collection avec des cellules, il y a encore un peu d'espacement. Y a-t-il quelque chose de spécial et pas immédiatement évident que je dois faire pour voir réellement une cellule de collectionView avec 0 espacement au-delà de la définition pour avoir 0 espacement? Merci.

Modifier * Quelqu'un code:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

    cell.backgroundColor = [UIColor clearColor];

    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(2, 2, cell.frame.size.width -4, cell.frame.size.height -4)];
    lbl.backgroundColor = [UIColor clearColor];
    lbl.font = [UIFont boldSystemFontOfSize:20];
    lbl.text = [NSString stringWithFormat:@"$%0.0f", [[amountsArray objectAtIndex:indexPath.row] floatValue]];
    lbl.textAlignment = NSTextAlignmentCenter;
    lbl.layer.borderWidth = 1;

    [cell addSubview:lbl];
    [lbl release];

    return cell;
}

enter image description here

18
Zigglzworth

J'ai résolu ce problème et j'ai eu la mise en page que je souhaite avec ce qui suit:

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

Dans IB, j'ai eu ces paramètres de mesure pour la collectionView:

Collection View size

Collection view flow layout size

6
Zigglzworth

Solution simple pour votre requête. Ajoutez ceci dans votre fichier .m de ViewController:

-(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;
}
23
Mihir Oza

SWIFT 3 Version de @ Mihiroza Solution

Travaillé pour des vues de collecte horizontale et verticale

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
}
12
MBH

Vous devez créer personnalisé UICollectionViewLayout.

L'espace entre les cellules sera égal à cellSpacing.

import UIKit

class CustomViewFlowLayout : UICollectionViewFlowLayout {

    let cellSpacing:CGFloat = 0

    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        if let attributes = super.layoutAttributesForElementsInRect(rect) {
            for (index, attribute) in attributes.enumerate() {
                if index == 0 { continue }
                let prevLayoutAttributes = attributes[index - 1]
                let Origin = CGRectGetMaxX(prevLayoutAttributes.frame)
                if(Origin + cellSpacing + attribute.frame.size.width < self.collectionViewContentSize().width) {
                    attribute.frame.Origin.x = Origin + cellSpacing
                }
            }
            return attributes
        }
        return nil
    }
}
11
Vojtech Vrbka

Afin de disposer d'un espace zéro, le nombre de cellules et leur largeur doit être divisible par la largeur de la vue de la collection, par exemple si vous avez 5 cellules à la fois avec une largeur de 100px, la vue de votre collection devrait alors avoir 500px de largeur , si c'est plus grand, il forcera un espace entre les cellules.

2
David Blue

Le documentation pour [UICollectionViewFlowLayout minimumInteritemSpacing] mention:

Cet espacement est utilisé pour calculer le nombre d'éléments pouvant correspondre à une seule ligne, mais après la détermination du nombre d'éléments, l'espacement réel peut éventuellement être ajusté à la hausse.

Vous devrez peut-être mettre en œuvre une disposition personnalisée pour le faire. La documentation peut être trouvée ici et un exemple ici .

1
Pascal Bourque