Ich habe eine benutzerdefinierte UITableViewCell, die mehrere UIButtons enthält. Die Rahmenposition jeder Schaltfläche ist relativ zur Zellenbreite. Ich setze autoresizingMask = UIViewAutoresizingFlexibleWidth so, dass es die Zellenbreite und die Tastenpositionen richtig anpasst, wenn die Anwendung mit dem Gerät entweder im Quer- oder Hochformat startet.
Das Problem ist, wenn das Gerät von einem Modus in den anderen gedreht wird. Die Schaltflächen passen die Positionen nicht an, da UITableViewCell wiederverwendbar ist. Mit anderen Worten, die Zelle wird nicht basierend auf der neuen UITalbeView-Breite initialisiert, da die Funktion initWithStyle der Zelle aufgerufen wird, bevor das Gerät gedreht wird, und nach der Gerätedrehung nicht erneut aufgerufen wird. Irgendwelche Vorschläge?
Nachdem ich stundenlang geforscht habe (einschließlich Beiträge auf dieser Seite), konnte ich keine Lösungen finden. Aber plötzlich geht eine Glühbirne an. Die Lösung ist sehr einfach. Ermitteln Sie, ob es sich bei der Geräteausrichtung um einen Querformat- oder Hochformatmodus handelt, und definieren Sie den ReusableCellIdentifier unter jeweils einem anderen Namen.
%Vor%Vorherige Antwort hat ein ernstes Problem. Sie sollten [UIApplication sharedApplication] .statusBarOrientation anstelle von [UIDevice curredetDevice] .orientation verwenden, da die Geräteausrichtung nichts mit der Schnittstellenausrichtung zu tun hat - Geräteausrichtung ist die physische Drehung basierend auf dem Beschleunigungssensor.
Die angekreuzte Antwort funktioniert in alten iOS-Versionen wie ein Zauber. Für iOS 6.0 habe ich den nächsten Code verwendet:
%Vor% Sie müssen die Zellenrahmenbreite (unter der Annahme, dass die Höhe im Hoch- und Querformat identisch ist) innerhalb Ihrer cellForRowAtIndexPath
-Methode korrigieren. Das ist, was hier funktioniert. Ich habe eine benutzerdefinierte TableViewCell mit IB erstellt und sie wird immer für die Breite von px 320 px initialisiert. Mit dem Definieren des Rahmens funktioniert es wie erwartet, selbst wenn die Zelle aus der Warteschlange "wiederverwendet" wird.
Ich hatte ein ähnliches Problem und dieser Beitrag hat mir geholfen. In meinem Fall habe ich eine benutzerdefinierte Klasse in einer separaten Datei deklariert, und in dieser Datei habe ich den folgenden Code in layoutSubviews
:
Dann implementiere ich in meiner Ansicht Controller willAnimateRotationToInterfaceOrientation:
und sende die Nachricht reloadData
an meine Tabellenansicht.
Damit muss ich die Methode cellForRow
nicht berühren.
Tags und Links iphone uitableview reusability rotation initwithstyle