Drehen Sie eine benutzerdefinierte UITableViewCell

7

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?

    
Wayne Lo 19.03.2010, 12:40
quelle

6 Antworten

7

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%     
Wayne Lo 19.03.2010, 14:14
quelle
13

Da UITableViewCell auch eine UIView ist, können Sie die setFrame-Methode überschreiben. Jedes Mal, wenn sich Ihre Tabellenansicht dreht, wird diese Methode für alle Zellen aufgerufen.

%Vor%     
balboa 01.06.2011 19:34
quelle
6

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.

    
Hrissan 19.12.2010 20:23
quelle
2

Die angekreuzte Antwort funktioniert in alten iOS-Versionen wie ein Zauber. Für iOS 6.0 habe ich den nächsten Code verwendet:

%Vor%     
user2144580 07.03.2013 14:17
quelle
1

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.

%Vor%     
Mike Bretz 26.12.2010 17:54
quelle
0

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 :

%Vor%

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.

    
Giovanni 14.03.2012 00:33
quelle