Frage

habe ich eine benutzerdefinierte UITableViewCell, die mehrere UIButtons enthält. Jeder Rahmen Position der Taste ist in Bezug auf die Zellenbreite. Ich habe autoresizingMask = UIViewAutoresizingFlexibleWidth so wird es die Zellenbreite und die Tastenpositionen richtig beim Start der Anwendung mit dem Gerät entweder im Quer- oder Hochformat anzupassen.

Das Problem ist, wenn das Gerät von einem Modus in den anderen gedreht wird, die Tasten einstellen keine Positionen, da die UITableViewCell wiederverwendbar ist. Mit anderen Worten, wird die Zelle nicht auf die neue UITalbeView Breite initialisierten basiert, weil die Funktion der Zelle initWithStyle aufgerufen wird, bevor das Gerät gedreht wird und wird nicht wieder nach dem Gerät Rotation genannt. Irgendwelche Vorschläge?

War es hilfreich?

Lösung 2

Nach Stunden der Forschung (einschließlich Beiträge auf dieser Webseite) zu verbringen, konnte ich keine Lösungen finden. Aber eine Glühbirne leuchtet auf ganz plötzlich. Die Lösung ist sehr einfach. Nur erkennen, ob die Geräteausrichtung Landschafts- oder Portraitmodus ist, und den ReusableCellIdentifier mit einem anderen Namen für jedes definieren.

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Andere Tipps

Da UITableViewCell ist auch ein UIView, können Sie SetFrame Methode außer Kraft setzen. Jedes Mal, dass Ihre Tabellenansicht dreht, wird diese Methode für alle Zellen genannt werden.

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 

vorherige Antwort hat ein ernstes Problem. Sie sollten verwenden [UIApplication shared] .statusBarOrientation statt [UIDevice currebtDevice] .orientation weil Geräte Orientierung nichts mit Schnittstelle Orientierung zu tun hat -. Geräteorientierung physikalische Rotation auf Beschleunigungsmesser basiert

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

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

Sie müssen Ihre Zellen Rahmenbreite fixieren (vorausgesetzt, die Höhe im Hoch- und Querformat gleiche ist) in Ihrer cellForRowAtIndexPath Methode. Das ist, was hier funktioniert. Ich habe eine benutzerdefinierte TableViewCell mit IB zu erstellen, und es wird immer für Portrait- 320 Pixel Breite initialisiert. Mit Definition den Rahmen es funktioniert wie erwartet, auch wenn die Zelle „wiederverwendet“ aus der Warteschlange.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}

Ich hatte ein ähnliches Problem und dieser Beitrag hat mir geholfen. In meinem Fall habe ich eine benutzerdefinierte Klasse in einer separaten Datei deklariert haben, und in dieser Datei Ich habe den folgenden Code in layoutSubviews:

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

Da ist in meinem View-Controller ich willAnimateRotationToInterfaceOrientation: nur implementieren und die reloadData Nachricht an meine Tabellenansicht senden.

Damit ich muss nicht die cellForRow Methode berühren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top