2017-10-12 1 views
0

Ich habe ein UILabel konfiguriert für die automatische Größe für mehrere Zeilen abhängig von der Textlänge. Das Label befindet sich in einer dynamisch skalierenden UITableViewCell mit Einschränkungen für alle Größen.Wie kann UILabel seine Abmessungen korrekt ändern, wenn sich die Ansichtsbreite ändert?

Der Code verschiebt den UILabel-Ursprung nach rechts und verkleinert dadurch die UILabel-Breite.

Das Etikett passt die Größe des Textes korrekt an und umschließt den Text. Bei der Positionierung des Ursprungs an seinem ursprünglichen Ort wird die Höhe des UILabel um 3 Zeilen erweitert. Aber nur 2 Zeilen Text sind erforderlich.

Der Grund ist die Höhe zu 3 Zeilen erweitert ist, dass mit Blick Animation zum ursprünglichen Punkt im Prozess, den Ursprung zurück zurückzukehren, Der Text zu 3 Zeilen erweitert und ein Rückruf 2.

Gibt es reduziert oder Einstellung, um die Zelle korrekt skalieren zu lassen? Oder 2 gibt es eine Möglichkeit, die Zelle daran zu hindern, die Größe zu ändern, wenn sich der Ursprung ändert. Bestimmtes. Ist es möglich, die UILabel-Option für mehrere Zeilen vorübergehend zu deaktivieren, wenn die Breite verkleinert und erweitert wird?

Hier sind Screenshots, die das Verhalten zeigen.

Abbildung (1) Position des Etiketts in der UITableViewCell, bevor der Ursprung geändert wird.

Before label origin Move

Figur (2) Der Ursprung der UILabel bewegt sich nach rechts und verringert die Breite des Etiketts. Beachten Sie, dass die zweite Zeile 2 Zeilen enthält und der Beschriftungsrahmen den Text fest umschließt.

Moved label origin right

Figure (3) Herkunft gibt die Position des ersten Bildes. Beachten Sie, dass das UIlabel der zweiten Zeile den Text locker umarmt und nicht zur ursprünglichen Höhe zurückkehrt.

Return origin to the first position

@IBAction func editTable(_ sender: UIBarButtonItem) { 

    if isEditingDynamic { 
     let animate = UIViewPropertyAnimator(duration: 0.4, curve: .easeIn) { 
      for cell in self.tableView.visibleCells as! [CellResize] { 
       cell.lblDescription.frame.origin.x = 16 
      } 
      self.tableView.beginUpdates() 
      self.tableView.endUpdates() 
     } 
     animate.addCompletion(){ 
      (position:UIViewAnimatingPosition) in 
      for cell in self.tableView.visibleCells as! [CellResize] { 
       cell.leadingContraint.constant = 0 
      } 
      self.tableView.beginUpdates() 
      self.tableView.endUpdates() 
     } 
     animate.startAnimation() 
     isEditingDynamic = false 
    } else { 
     let animate = UIViewPropertyAnimator(duration: 0.4, curve: .easeIn) { 
      for cell in self.tableView.visibleCells as! [CellResize] { 
       cell.lblDescription.frame.origin.x = 60 
      } 
      self.tableView.beginUpdates() 
      self.tableView.endUpdates() 
     } 
     animate.addCompletion(){ 
      (position:UIViewAnimatingPosition) in 
      for cell in self.tableView.visibleCells as! [CellResize] { 
       cell.leadingContraint.constant = 54 
      } 
      self.tableView.beginUpdates() 
      self.tableView.endUpdates() 
     } 
     animate.startAnimation() 
     isEditingDynamic = true 
    } 
} 

Antwort

0

Sind Sie in der Lage, einige Codes, wie Sie Ihre Tabellenansicht Zellen und Controller schreiben eingerichtet ist? Normalerweise, was ich tun ist, ich nur eine einzige Zeile UILabel schaffen und legen Sie sie in der Inhaltsansicht der Zelle, Zwangs es Top, Left, Trailing & Leading mit einem height constraint >= current & numberOfLines = 0.

Dann, in der tableview cell, werde ich seine estimatedHeight to be 100 und heightForRow to be UITableViewAutomaticDimension setzen.

In diesem Fall verarbeitet TableView automatisch die Höhe der Zelle basierend auf dem Inhalt des Labels.

+0

Ja, ich habe die Zelle so konfiguriert, dass sie mit allen Attributen dynamisch ist, die Sie beschreiben, mit Ausnahme der Höhe eins. Es gibt keine Höhenbeschränkung, da die 4 Seiten alle gesetzt sind. Das Problem liegt in der Animation der Größenanpassung. Ich kann sehen, wie sich die Größe des Labels auf die ursprüngliche Größe ändert, das UILabel umschließt den Text von 2 Zeilen auf 3 Zeilen und dann zurück auf 2, bevor er fertig ist. Wenn das Etikett auf 3 Zeilen eingestellt ist, wird die Höhe nicht mehr auf 2 Zeilen angepasst, bis der Etikettenursprung wieder kleiner wird. – Litehouse

Verwandte Themen