Ich versuche, eine Liste von Alarmen in einer UICollectionView zu erstellen, wo ein "ein" Alarm ein Bild (alarmImg) und Zeitlabel (alarmLbl) hat und ein "off" Alarm ein Bild hat und leeres Zeitlabel. Ich möchte, dass das "Aus" -Alarmbild zentriert wird, während das "Ein" -Alarmbild einen Offset hat, um das Etikett zu berücksichtigen.Swift: Mysterious Constraint erscheint
Dies ist mein Code in cellForItemAtIndexPath
, wobei Zelle eine aus der Warteschlange eingereihten Zelle und AlarmLbls ist ein String-Array von Alarmzeiten.
cell.alarmLbl.text = alarmLbls[indexPath.row]
if alarmLbls[indexPath.row] == "" {
cell.alarmImg.image = UIImage(named: "alarm_off")
let alarmImgYConstraintOff = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 1, constant: 0)
alarmImgYConstraintOff.active = true
cell.layoutIfNeeded()
}
else {
cell.alarmImg.image = UIImage(named: "alarm_on")
let alarmImgYConstraintOn = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 0.75, constant: 0)
alarmImgYConstraintOn.active = true
cell.layoutIfNeeded()
}
Initial Layout sieht gut aus, aber wenn ich reloadItemsAtIndexPaths
auf den Zellen mit „auf“ Alarmen aufrufe, erhalte ich einen Einschränkungsfehler anzeigt, dass der „off“ Zwang angewandt wird, wobei in diesem Fall der „on“ Constraint bricht und die Bilder verschieben sich in die Mitte. Der erste Block if
scheint laut Drucktests nicht für diese Zellen aufgerufen zu werden (nur für "off" -Zellen, die vom Bildschirm neu geladen werden), und dies ist der einzige Ort, an dem ich diese Einschränkungen gesetzt habe.
Ich habe gerade über jede Iteration von Lösungen versuchte ich mir vorstellen kann:
- Erzwingen
alarmImgYConstraintOff.active = false
- ein Zentrum Einschränkung über IB einstellen und es aus programmatisch
- Umschalten der „auf“ Block drehen auf die
if
Anweisung - Ändern
else
zuelse if
Wenn Sie die Priorität "Ein" auf etwas höher als die Priorität "Aus" setzen, werden alle "Aus" -Bilder beim erneuten Laden nach oben verschoben. Aus irgendeinem Grund jedoch verschieben sich die Bilder beim vierten Nachladen in ihre ursprüngliche zentrierte (korrekte) Position zurück.
Irgendwelche Ideen, was ich hier falsch mache?
EDIT: Code zum Drehen unerwünschte Einschränkungen ab
cell.alarmLbl.text = alarmLbls[indexPath.row]
let alarmImgYConstraintOff = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 1, constant: 0)
let alarmImgYConstraintOn = NSLayoutConstraint(item: cell.alarmImg, attribute: .CenterY, relatedBy: .Equal, toItem: cell.mainView, attribute: .CenterY, multiplier: 0.75, constant: 0)
if alarmLbls[indexPath.row] == "" {
cell.alarmImg.image = UIImage(named: "alarm_off")
alarmImgYConstraintOn.active = false
alarmImgYConstraintOff.active = true
cell.layoutIfNeeded()
}
else {
cell.alarmImg.image = UIImage(named: "alarm_on")
alarmImgYConstraintOff.active = false
alarmImgYConstraintOn.active = true
cell.layoutIfNeeded()
}
Initial Layout sieht gut aus, wie vorher, aber ich bin immer noch das Layout bricht, sobald ich eine „auf“ Zelle neu zu laden (mit Ausnahme das allererste Reload). Z.B. Das zweite Neuladen einer "An" -Zelle bricht, ebenso wie das nachfolgende Wiederaufladen aller "An" - und "Aus" -Zellen (obwohl für "Aus" -Zellen kein sichtbarer Unterschied zu sehen ist); Wenn ich jedoch zuerst eine "Aus" -Zelle neu lade, bricht nichts ab, bis ich eine "An" -Zelle neu lade.
Wenn Sie eine Einschränkung aktivieren, sollten Sie die andere deaktivieren. Wenn Sie das versucht haben und es nicht funktioniert hat, haben Sie es wahrscheinlich nicht richtig gemacht. Können Sie den Code von diesem Versuch veröffentlichen? – dan
Bearbeitete Frage mit neuem Code und neuen Ergebnissen! Immer noch keine Würfel, leider. – bittersweetblue