2014-10-12 7 views
9

Ich habe statische UITableView mit Basic-Stil Zellen, Standard 44 Höhe. In jeder Zelle befindet sich ein Label mit dem Stil Body text. Auf diese Weise erhalte ich das Verhalten des dynamischen Typs kostenlos.UILabel verschwinden von statischen UITableViewCell mit dynamischen Typ

Es funktioniert, außer wenn:

  1. öffnen app
  2. öffnen Tabellenansicht
  3. Einstellungen öffnen ANG ändern Textgröße (größer kleinerer)
  4. öffnen App wieder, Etiketten verschwinden.
  5. gehen zu einer anderen Ansicht (hinten) und wieder unruhige Tabelle öffnen - Text geändert und sieht gut aus

ich diese

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(preferredContentSizeChanged) 
               name:UIContentSizeCategoryDidChangeNotification object:nil]; 
} 

- (void)preferredContentSizeChanged 
{ 
    // adjust the layout of the cells 
    // for some reason text from labels are disappear 
    self.statusBarCell.textLabel.text = @"Status bar"; 
    self.itemColorCell.textLabel.text = @"Color"; 

Aber ich habe zu beheben verwalten einen anderen mit folgendem Hack

genau das gleiche UITableView und das funktioniert nicht. Ich habe Steckdosen für Zellen und Etiketten ausprobiert. Ich habe versucht reloadData und setNeedsLayout Methoden.

Hier sind Bilder. Etiketten sind gelb und Seiten ist blau:

Before, cells with content After, cells without labels

Antwort

2

I geänderte Tabelle zu einer dynamischen und umgesetzt cellForRowAtIndexPath: Methodentabelle Etikett in Code zuzuweisen. Das hilft mir nicht.

Als nächstes änderte ich Tabellenansicht Zelle Stil von grundlegende bis benutzerdefinierte. Ich musste mein eigenes Label hinzufügen und AutoLayout Constraints im Storyboard einrichten. Dies ist das Problem gelöst. preferredContentSizeChanged Benachrichtigung ist nicht nötig.

In meinem cellForRowAtIndexPath:

cell.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 

Ich werde ein Apple Radar später einreichen. Sieht so aus, als könnten wir den dynamischen Typ nicht mit statischen Tabellen verwenden.

Viel Glück und bitte implementieren Sie Dynamic Type in Ihren Apps. Das ist es wert.

4

Ich habe kürzlich mit statischen Tabellen gespielt und versucht, einen dynamischen Typ hinzuzufügen. Ich habe die gleichen Ergebnisse wie du - man kann dieses verschwindende Etikett sogar in Apples eigener Contacts.app sehen.

Auch nachdem ich meine Tabelle von statisch in dynamisch geändert und eine kleine benutzerdefinierte Zelle mit einem UILabel implementiert habe (konfiguriert mit der Schriftart UIFontTextStyleBody in der XIB), schien die Tabelle ihren Inhalt bei Änderung der bevorzugten Textgröße nicht zu aktualisieren Systempräferenzen.

Allerdings: Ich habe versehentlich einige Ergebnisse nach wie folgt vorgehen: in der Unterklasse für meine benutzerdefinierte Zelle I prepareForReuse umgesetzt und neu initialisieren die Schriftart des Etiketts auf den richtigen Stil:

- (void)prepareForReuse { 

    self.label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; 
} 

Mit dem Hack über meinem Tabellenzellen passen ihre Schriftarten dynamisch an Änderungen der Systemeinstellungen an.

Hoffe, dass hilft.

+0

Dank für die gemeinsame Nutzung haben, versuchte ich es auf meinem anderen statischen Tisch und es hat nicht geholfen. Ich muss noch Etiketten Text auf 'preferredContentSizeChanged' Benachrichtigung erstellen. –

+0

Nein, meine obige "Lösung" funktioniert nicht mit statischen Tabellen, aber ich denke, intern ist das Problem dasselbe: Die Labels in den Zellen werden nicht korrekt auf die neuen Schriften aktualisiert - wahrscheinlich weil zu viel Caching läuft . – mschmidt

+0

Ich sehe, in meiner Antwort mache ich die gleiche Codezeile. Nur ich mache es in 'cellForRowAtIndexPath' Methode von' UITableViewController'. –

1

Versuchen Sie, [self.table reloadData] hinzuzufügen; in Ihrer preferredContentSizeChanged-Methode.

+0

Upvoted versehentlich (und kann nicht downvote). Funktioniert nicht. –

0

Meiner Erfahrung nach ist dies ein Storyboard-Problem mit dem 'basic' tableViewCell-Stil. Wenn eine UIContentSizeCategoryDidChangeNotification empfangen wird, werden die Attribute für das textLabel, die in Storyboard festgelegt wurden, "vergessen", einschließlich des eigentlichen Texts. Ich habe ein ähnliches Problem gelöst, indem ich stattdessen die benötigten textLabel-Attribute im Code (in CellForRowAtIndexPath) gesetzt habe.

0

Die Beschriftung wird aus der übergeordneten Ansicht entfernt. Versuchen Sie folgendes:

override func prepareForReuse() { 
    super.prepareForReuse() 
    contentView.addSubview(unitLabel) 
} 
1

Wenn Sie den Ausgang des textLabel, detailTextLabel selbst wurden anschließen, löschen Sie bitte die Steckdose. und Sie werden Eigenschaften der UITableViewCell verwenden.

open class UITableViewCell { 
    open var textLabel: UILabel? { get }  
    open var detailTextLabel: UILabel? { get } 
0

Ich hatte das gleiche Problem und wollte diese ohne Code lösen. Also änderte ich

  • den statischen Zelltyp von einfach zu benutzerdefinierten,
  • hinzugefügt mein eigenen Label
  • hinzugefügt vorangestellte und vertikale Mitteln Einschränkungen
  • stellen Sie das dynamische Typ Kontrollkästchen auf dem Etikett auf
  • und die Schriftart des Labels zu Textvorlagen Körper. -

Dies funktioniert auch für Tabellenansichten, dass kein Programmcode/Klasse

Verwandte Themen