J'ai un UICollectionView
avec un segmented control
pour basculer entre les données. Mais comment puis-je modifier les propriétés de la taille UICollectionViewCell
par programme ? je peux alors personnaliser chaque style de manière appropriée pour chaque type de données.
Par exemple changez la largeur à 520 points et la hauteur à 100. Je suis nouveau dans le développement iOS et j'ai de l'expérience en CSS: /
Je sais comment le faire dans Xcode (évidemment) mais je ne connais pas les méthodes correctes pour le changer dans Swift. Toutes les idées ou commentaires sont très appréciés (Y)
Assurez-vous de vous conformer à UICollectionViewDelegateFlowLayout pour votre classe (pour Swift4).
eg. class MyClass: UICollectionViewDelegateFlowLayout
Avant Swift 3
//Use for size
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
}
//Use for interspacing
func collectionView(collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
return 1.0
}
func collectionView(collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
return 1.0
}
// Pour Swift 3
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
// Pour Swift 4
extension MyClass: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
}
utilise le même code que celui indiqué ci-dessus pour Swift 3 mais juste assurez-vous que votre classe est conforme au protocole UICollectionViewDelegateFlowLayout
Swift
Méthodes de @ sumit-oberoi answer ne sera pas appelé si vous utilisez Swift 3. Pour que cela fonctionne, apportez les modifications suivantes:
Conformez-vous au protocole UICollectionViewDelegateFlowLayout
.
Implémentez ces méthodes:
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> CGSize {
}
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
Notez les modifications:
_
avant collectionView
dans le nom de la méthodeNSIndexPath
devient IndexPath
Swift
override func viewDidLoad() {
super.viewDidLoad()
let cellSize = CGSize(width:80 , height:80)
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //.horizontal
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumLineSpacing = 1.0
layout.minimumInteritemSpacing = 1.0
myCollectionView.setCollectionViewLayout(layout, animated: true)
myCollectionView.reloadData()
}
si vous utilisez le code ci-dessous de Gaurav Rami
let cellSize = CGSize(width:80 , height:80)
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //.horizontal
layout.itemSize = cellSize
layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
layout.minimumLineSpacing = 1.0
layout.minimumInteritemSpacing = 1.0
myCollectionView.setCollectionViewLayout(layout, animated: true)
et obtenez ce message "L'instantané d'une vue qui n'a pas été rendue donne un instantané vide. Assurez-vous que votre affichage a été rendu au moins une fois avant l'instantané ou après la mise à jour de l'écran." vous devez le supprimer animé lors du réglage disposition de la vue pour la vue collection
myCollectionView.setCollectionViewLayout(layout, animated: false)
alors le message disparaîtra
first Conform protocol the UICollectionViewDelegateFlowLayout
set width and height UICollectionViewCell
UIcollectionViewCell Hight = 300;
UIcollectionViewCell Width = 380;
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout,sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: CGFloat((380)), height: CGFloat(300))
}