2015-02-23 4 views
7

Ich spielte mit dynamischen UICollectionViewCells und habe festgestellt, dass auf iOS 8 Aufruf cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) auf einem UICollectionViewCell eine falsche Breite zurückgibt. Gegenwärtig ist die einzige Problemumgehung, die das behebt, explizit das Hinzufügen einer Breiteneinschränkung, um die Zellbreite zu erzwingen. Der Code unten in einer Zelle Unterklasse verwendet:UICollectionViewCell SystemLayoutSizeFittingSize gibt falsche Breite zurück

func calculatePreferredHeightForFrame(frame: CGRect) -> CGFloat { 
    var newFrame = frame 
    self.frame = newFrame 
    let widthConstraint = NSLayoutConstraint(item: contentView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: CGRectGetWidth(frame)) 
    contentView.addConstraint(widthConstraint) 
    self.setNeedsUpdateConstraints() 
    self.updateConstraintsIfNeeded() 
    self.setNeedsLayout() 
    self.layoutIfNeeded() 
    let desiredHeight: CGFloat = self.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height 
    newFrame.size.height = CGFloat(ceilf(Float(desiredHeight))) 
    contentView.removeConstraint(widthConstraint) 
    return CGRectGetHeight(newFrame) 
} 

Ich weiß, dass mit iOS 8 und dynamische UICollectionViewFlowLayout, dass die UICollectionViewCell der content Zwänge anders behandelt aber gibt es etwas, was ich bin hier fehlt? Was muss getan werden, um sicherzustellen, dass systemLayoutSizeFittingSize eine bestimmte Breite in einer Zelle verwendet?

Ich stieß auch auf diesen Beitrag (Specifying one Dimension of Cells in UICollectionView using Auto Layout) und glaube, dies könnte tatsächlich meine Frage ungültig machen. Vielleicht ist UICollectionViewFlowLayout nicht für Zellen mit nur einer dynamischen Dimension ausgelegt, erklärt aber immer noch nicht, warum die Zelle eine ungewöhnliche Breite hat.

+0

Ich habe das exakt gleiche Problem, meine Zellenbreite wird immer als 320 (xib Ansichtsgröße) zurückgegeben. Kann nicht wirklich umgehen ... –

+3

Haben Sie UILabel mit mehreren Zeilen in dieser Zelle? Wenn ja, haben Sie wahrscheinlich die maximale Layoutbreite falsch gewählt. –

+0

@ hrs.to Wenn Sie die Frage erneut lesen, werden Sie sehen, es hat nichts mit Etiketten zu tun, sondern die Größe der gesamten Zelle –

Antwort

5

Ich habe dasselbe Problem konfrontiert. Der Schlüssel ist die Verwendung von Prioritäten beim Abrufen von systemLayoutSize.

+0

der Subtraktion Teil funktioniert nicht für mich. Ich subtrahiere 20 von der collectionview Breite, da ich Abschnittinsatz von 10 auf der linken und rechten Seite habe. Aber ich schließe immer noch mit 320 nicht 300. – Nil

+0

@Nil hast du 'fitSize' und' size' Variable überprüft? Werden Prioritäten aus meiner Antwort kopiert? –

+0

Vergiss es. tatsächlich habe ich self.prototypeCell anstelle von self.prototypeCell.contentView verwendet. Deshalb ist es gebrochen. – Nil