Sous-vue image est incorrecte lors de la création de UICollectionViewCell
Le problème
J'ai créé un UICollectionViewController avec une coutume UICollectionViewCell.
La coutume de cellules contient une grande et rectangulaire UIView (nommé colorView) et un UILabel (nommé nameLabel).
Quand la collection est d'abord renseignée avec ses cellules et j'ai l'impression colorView.le cadre, l'imprimé cadres ont des valeurs incorrectes. Je sais qu'ils sont incorrects, parce que le colorView images sont plus grandes que les cellules image d'eux-mêmes, même si le colorView pénètre correctement.
Cependant, si j'ai faites défiler la collectionView suffisant pour déclencher une réutilisation d'un déjà créé une cellule, la colorView.cadre a maintenant des valeurs correctes!
J'ai besoin de la corriger cadres parce que je veux appliquer des coins arrondis à l'colorView couche et j'ai besoin de la corriger coloView taille pour ce faire.
Par ailleurs, au cas où vous vous demandez, colorView.limites a la même taille incorrecte de valeur que la colorView.cadre.
La question
Pourquoi les cadres incorrecte lors de la création des cellules?
Et maintenant un peu de code
C'est mon UICollectionViewCell:
class BugCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var colorView: UIView!
@IBOutlet weak var nameLabel: UILabel!
}
et c'est le UICollectionViewController:
import UIKit
let reuseIdentifier = "Cell"
let colors = [UIColor.redColor(), UIColor.blueColor(),
UIColor.greenColor(), UIColor.purpleColor()]
let labels = ["red", "blue", "green", "purple"]
class BugCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return colors.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as BugCollectionViewCell
println("ColorView frame: \(cell.colorView.frame) Cell frame: \(cell.frame)")
cell.colorView.backgroundColor = colors[indexPath.row]
cell.nameLabel.text = labels[indexPath.row]
return cell
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let width = self.collectionView?.frame.width
let height = self.collectionView?.frame.height
return CGSizeMake(width!, height!/2)
}
}
L'affichage de la collection est le programme d'installation afin de montrer deux cellules à la fois, à la verticale, chaque cellule contenant un grand rectangle peint avec une couleur et une étiquette avec le nom de la couleur.
Lorsque j'exécute le code ci-dessus sur le simulateur, j'obtiens le résultat imprimé:
ColorView frame: (0.0,0.0,320.0,568.0) Cell frame: (0.0,0.0,375.0,333.5)
ColorView frame: (0.0,0.0,320.0,568.0) Cell frame: (0.0,343.5,375.0,333.5)
C'est un drôle de résultat - colorView.cadre a une hauteur de 568 points, tandis que la cellule de trame n'est 333.5 points de haut.
Si je fais glisser le collectionView vers le bas et une cellule devient réutilisés, le résultat suivant est imprimé:
ColorView frame: (8.0,8.0,359.0,294.0) Cell frame: (0.0,1030.5,375.0,333.5)
ColorView frame: (8.0,8.0,359.0,294.0) Cell frame: (0.0,343.5,375.0,333.5)
Quelque chose, que je ne peux pas comprendre, qui s'est passé le long du chemin qui corrige le cadre de colorView.
Je pense qu'il a quelque chose à voir avec le fait que la cellule est chargé à partir de la Pointe, de sorte qu'au lieu de l'aide de l'init(frame: cadre) initialiseur le contrôleur utilise la fonction init(codeur: aCoder) initialiseur, de sorte que dès que la cellule est créée, elle vient probablement avec certains d'image par défaut que je ne peux pas modifier de toute façon.
Je vais apprécier toute aide qui me permet de comprendre ce qui se passe!
Je suis en utilisant Xcode 6.1.1. avec le SDK iOS 8.1.
- Comment vous positionnez ColorView? Vous n'êtes pas à l'aide de mise en page automatique de droite? Je pense que ce qui vous arrive est le point de vue mise en page est chargé de la plume et traduit de mise en page automatique. Mais votre storyboard viewcontroller la taille est différente pour le simulateur. Utiliser la mise en forme automatique de la position de votre point de vue et les choses devraient fonctionner à droite, puis.
- Hey @CharlieWu, je suis en effet l'utilisation de l'auto mise en page... colorView et nameLabel sont entièrement contraint...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir la dernière images de votre cellule en substituant layoutIfNeeded() dans votre Cellule personnalisé de la classe comme ceci:
puis dans votre UICollectionView de la Source de données la méthode cellForRowAtIndexPath: faites ceci:
UITableViewCell
ainsi.layoutSubviews()
ne m'a pas aidé. Seulement cela a aidé. Vérifiez cet article medium.com/@abhimuralidharan/....J'ai eu le même problème avec un
UICollectionViewCell
l'utilisation de l'auto contraintes de mise en forme.J'ai dû appeler
layoutIfNeeded
avant j'étais à la configuration de mon sous-vue qui s'appuient sur les points de vue largeur du cadre.- (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded]; /* frames already calculated here */ }
Ok, je comprends maintenant que la cellule est créée avant la mise en page automatique définit de ses cadres. C'est la raison pour laquelle, au moment de la création des limites sont mauvais. Lorsque les cellules sont réutilisés les cadres ont déjà été corrigés.
J'ai eu ce problème lors de la création d'une coutume UIView qui l'a placé quelques couches et des sous-vues dans des coordonnées spécifiques. Lorsque des instances de cette UIView ont été créés, le placement des sous-vues étaient toutes dans l'erreur (car la mise en page automatique n'avais pas un coup de pied hors encore).
J'ai découvert qu'au lieu de la configuration de l'affichage des sous-vues sur
init(coder: aCoder)
j'ai dû remplacer la méthodelayoutSubviews()
. Ceci est appelé lors de la mise en page automatique demande à chaque vue de la mise en page de son propre sous-vues, de sorte à ce point, au moins, la vue parent a la bonne image et je peux l'utiliser pour la pose de la sous-vues correctement.Probablement, si j'avais utilisé des contraintes sur l'affichage personnalisé de code au lieu de traiter moi-même avec des tailles d'image et de positionnement, puis la mise en page aurait été fait correctement et il ne serait pas nécessaire de remplacer
layoutSubviews()
.Eu ce problème avec les Graphiques de Base du dessin dans iOS 10, Swift 3.0.1.
Ajouter cette méthode pour
UICollectionView
sous-classe:Mon problème était que les Graphiques de Base des formes n'ont pas été calculé correctement, car un
layoutSubviews()
n'était pas appelé.