4 Stimmen

Korrektes Drehen einer UITableView mit Transform, ohne mit Interface Builder herumzupfuschen

UiTableView bietet keinen horizontalen Bildlauf im Querformat.

Mein UiTableView ist nicht bildschirmfüllend (also kann ich es nicht einfach im horizontalen Modus verwenden, während ich meine Inhalte, die Bilder sind, drehe)

Ich fand, dass meine UiTableView drehen mit Transforms.. Ich muss es in Interface Builder in einer seltsamen Position positionieren, so dass es beim Drehen einfach richtig aussieht.....

Hat jemand dies getan, ohne mit Interface Builder herumzuspielen? Gleicher Code?

4voto

Umair Aamir Punkte 1511

Ok, das Problem war, dass, da die Breite des Tableviews flexibel war, nach der Drehung die Breite der Zellen (die eigentlich die Höhe ist) auch erhöht wurde. Ich habe das Problem überwunden, indem ich die UITableView subclassing und die layoutSubviews-Methode überschrieben habe, so dass es jetzt wie folgt aussieht:

- (void)layoutSubviews {

    [super layoutSubviews];

    for (UIView* child in [self subviews]) {

        CGRect frame1 = child.frame;
        if ([child isKindOfClass:[UITableViewCell class]]) {
            frame1.size.width = 120;
            child.frame = frame1;        
        } 
    }

}

3voto

Marc W Punkte 18889

Siehe den Abschnitt Autoresizing-Verhalten auf der Seite Fenster und Ansichten konzeptionelle Anleitung auf der Apple-Website. Darin wird erklärt, wie man eine automatische Drehung vom Hoch- ins Querformat und wieder zurück erreichen kann, ohne Interface Builder zu verwenden und ohne sich mit der manuellen Implementierung komplexer Transformationen beschäftigen zu müssen.

Zum Drehen Ihres benutzerdefinierten Inhalts und zum Deaktivieren des Scrollens siehe shouldAutorotateToInterfaceOrientation:interfaceOrientation , willRotateToInterfaceOrientation:duration: et didRotateFromInterfaceOrientation: in UIViewController . Sie können diese Methoden implementieren, um Rotationsereignisse abzufangen, zu prüfen, in welche Richtung Sie sich bewegen, und sich um Ihre benutzerdefinierten Zeichen- und Eigenschaftseinstellungen kümmern.

Editar

Als Antwort auf Ihren Kommentar habe ich diesen Abschnitt aus der Tabellenansicht Programmierhandbuch von Apple:

UITableView erbt von UIScrollView, die das Bildlaufverhalten Verhalten für Ansichten definiert, deren Inhalt größer als die Größe des Fensters. UITableView definiert den Bildlauf neu Verhalten so um, dass es nur vertikales Scrollen zu ermöglichen.

Vielleicht hat Apple das horizontale Scrollen von Tabellenansichten als Verstoß gegen die Richtlinien für die menschliche Schnittstelle eingestuft. Ich frage mich, ob Sie das Bildlaufverhalten neu definieren könnten, wenn Sie eine Unterklasse UITableView aber das wäre wahrscheinlich eine Menge Arbeit durch Versuch und Irrtum. Wenn Sie tatsächlich in der Lage sind, dies zu erreichen, bin ich sicher, dass viele Menschen hier würden daran interessiert sein, wie Sie es getan haben. Ich habe eine Weile herumgesucht und versucht, die Lösungen anderer Leute zu finden, aber ich konnte da draußen nichts finden.

Andererseits könnte es sein, dass Apple Ihre Anwendung nicht in den App Store aufnimmt, wenn Sie dies tun, vorausgesetzt, dass die HIG wirklich verletzt wird.

0 Stimmen

Vielen Dank für Ihre Antwort, aber wie erwähnt, UiTableView bietet keine horizontale SCrolling im Querformat-Modus. Also, wenn ich Autorotation verwendet, wird es nur nach oben und unten und NICHT LINKS <-> RECHTS scrollen.

1voto

Sie können das Gewünschte erreichen, indem Sie Folgendes tun:

  1. Erstellen Sie einen UITableView und binden Sie ihn an einen UIViewController, entweder durch Code oder über IB (verwenden Sie keinen UITableViewController)
  2. Wenden Sie eine Transformation um 90 Grad gegen den Uhrzeigersinn auf Ihre Tabelle an.
  3. Wenden Sie in Ihrer tableView:cellForRowAtIndexPath: Methode eine 90-Grad-Transformation im Uhrzeigersinn auf Ihre Zellen an, bevor Sie sie zurückgeben.

Boum! Sie haben jetzt eine horizontal scrollende Tabelle mit vertikalen Zellen. Möglicherweise müssen Sie die Breite und Höhe Ihrer Zellen und Ihrer Tabelle korrigieren, damit alles richtig aussieht, aber ich nehme an, das könnte Ihnen helfen.

Ein weiterer Tipp: Sie können den Mittelpunkt der Drehung mit der Eigenschaft layer. anchorPoint der Tabelle steuern (es ist ein CGPoint). Wenn Sie ihn an einer anderen Stelle als dem Mittelpunkt der Ansichtsgrenzen festlegen, werden die Rotationseffekte (und alle anderen Effekte) diesen Punkt als Referenz verwenden.

0 Stimmen

Ich habe dies ausprobiert und kann den Tableview nicht dazu bringen, sich wieder korrekt ins Hochformat zu drehen. Drehen zu Landscape von Portrait, ich bin in der Lage, die Zellen die Art, wie ich sie brauchen, um anzupassen. Wenn ich jedoch zurückdrehe, scrollt die Tabellenansicht nicht vertikal, sondern horizontal. Hat jemand eine Idee?

1voto

Andrei Stanescu Punkte 6283

Ich weiß, es ist ein bisschen spät, aber hier ist meine Antwort.

Wie andere bereits gesagt haben, können Sie eine 90-Grad-Transformation auf den Tableview anwenden, um einen horizontalen Bildlauf zu erreichen. Aber um den seltsamen Rahmenfehler zu beseitigen, müssen Sie den Rahmen vor der Transformation erhalten, die Transformation anwenden und dann den Rahmen in den ursprünglichen wiederherstellen.

// Save the tableview frame (as it is layed out in IB)
CGRect oldframe = tableview.frame;

// Apply the transform
tableview.transform=CGAffineTransformMakeRotation(M_PI/2);

// For some weird reason, the frame of the table also gets rotated, so you must restore the
//original frame    
tableview.frame = oldframe;

1 Stimmen

Utilisez M_PI_2 anstatt zu teilen M_PI .

0 Stimmen

Besser spät als nie! Ich danke Ihnen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X