web-dev-qa-db-fra.com

Espacement des cellules UICollectionView en fonction de la taille de l'écran du périphérique

J'ai implémenté UICollectionView, la taille de la cellule est w90 h90. Lorsque je l'exécute sur iPhone 6, j'obtiens le bon espacement entre les cellules, mais lorsque je le fais sur l'iPhone 5, j'obtiens plus d'espacement entre les cellules. Ma question est de savoir comment puis-je changer la taille de la cellule en fonction de la taille de l'écran du périphérique , supposons que si la taille de la cellule était w80 h80, j'obtiens aussi des résultats corrects sur l'iPhone 5. ce que je suis en train de faire est

 override func viewWillAppear(animated: Bool) {

        var scale = UIScreen.mainScreen().scale as CGFloat
        println("Scale :\(scale)")

        var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize
        println("Cell size :\(cellSize)")

        imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale)
        println("Image size : \(imageSize)")

    }

// sizeForItemAtIndexPath

  func collectionView(collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
   {

        return imageSize!

   }

Résultat sur iPhone 6: enter image description here

Résultat sur iPhone 5s enter image description here

Objective-C/Swift convient parfaitement pour la solution ..__ Merci.

21
codeIgnitor

Pour une réponse un peu plus flexible

Vous permet d'ajuster le nombre de colonnes et l'espacement, en développant la réponse de Zaid Pathan

// MARK: UICollectionViewDelegateFlowLayout delegate method
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
    let cellSpacing = CGFloat(2) //Define the space between each cell
    let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets"
    let numColumns = CGFloat(3) //The total number of columns you want

    let totalCellSpace = cellSpacing * (numColumns - 1)
    let screenWidth = UIScreen.mainScreen().bounds.width
    let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns
    let height = CGFloat(110) //whatever height you want

    return CGSizeMake(width, height);
}
14
Tim
I wanted 3 item in a section in Both IPad and iPhone. I worked out using the following code. Hope it helps!

1 ) Implement UICollectionViewDelegateFlowLayout delegate


2 )  var device = UIDevice.currentDevice().model

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        if (device == "iPad" || device == "iPad Simulator")
        {
            return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230)
        }
        return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120)
    }
2
A.G

Objective-c exemple:

utiliser cette fonction

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return CGSizeMake(Your desired width, Your desired height);    
    // example: return CGSizeMake(self.view.frame.size.width-20, 100.f);
}
1
Group

Pour développer la réponse de Tim , une petite mise en garde concerne les largeurs de points partielles: L'arrondi des largeurs de points partiels peut entraîner une largeur plus large que ne le permet le nombre de colonnes souhaitées. Une façon de contourner ce problème consiste à tronquer la largeur à l'aide de trunc ():

 return CGSizeMake(trunc(width), height)
0
crossroadsman