0

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:

  1. Erzwingen alarmImgYConstraintOff.active = false
  2. ein Zentrum Einschränkung über IB einstellen und es aus programmatisch
  3. Umschalten der „auf“ Block drehen auf die if Anweisung
  4. Ändern else zu else 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.

+0

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

+0

Bearbeitete Frage mit neuem Code und neuen Ergebnissen! Immer noch keine Würfel, leider. – bittersweetblue

Antwort

0

Wenn Sie alarmImgYConstraintOff.active = true einstellen, fügen Sie lediglich eine zweite Einschränkung zu dem hinzu, was Sie bereits haben. Entfernen Sie zuerst die unerwünschte Einschränkung, bevor Sie eine neue anwenden. Dies sollte das Problem beheben.

+0

Ich habe meinen Code mit Ihrem Vorschlag gepostet, aber ich sehe immer noch Probleme (siehe bearbeitete Frage). – bittersweetblue

+0

Ich habe kürzlich eine ähnliche Sache in meiner App mit einer beweglichen Ansicht gemacht. Ich habe es getan, indem ich den Wert der Einschränkung geändert habe.Konstante statt Hinzufügen und Entfernen von Einschränkungen und hatte keine Probleme. Vielleicht versuchen Sie es? – livtay

+0

Ich habe es gerade mit einer Einschränkung versucht, indem ich die .constant = 0 im Block "off" und -10 im Block "on" mache. "On" -Zellen werden mit Layoutumbrüchen neu geladen, obwohl die Bilder dort bleiben, wo sie sein sollen. "Off" -Zellen werden mit Layout-Breaks neu geladen und in die -10-Position verschoben. Es sieht so aus, als ob das Problem erneut beginnt, sobald ich eine "An" -Zelle neu lade. Interessanterweise verschiebt sich das Bild für eine (aber nicht alle) der "Aus" -Zellen auf die korrekte Position beim vierten Nachladen zurück. – bittersweetblue

0

Versuchen Sie, einen Verweis auf dieselbe Einschränkung zu speichern und ändern Sie einfach den .multiplier auf 1 oder 0,75. Es ist nicht notwendig, die gesamte Beschränkung zu ändern, nur um dies zu ändern.

+0

Es sieht so aus, als ob Constraint-Multiplikatoren schreibgeschützte Eigenschaften sind. Sie können sie also nicht ändern, indem Sie den .multiplier auf etwas anderes setzen. – bittersweetblue

Verwandte Themen