2 Stimmen

eine Frage zur Rotation, wenn mehrere Ansichten beteiligt sind

Ich bin ein relativer Neuling in Sachen Kakao und Programmierung für das iPad.

Ich habe eine App gebaut, die einen Split-View-Controller hat. In der Detailansicht befindet sich eine Symbolleiste mit einer Schaltfläche darauf. Wenn die Schaltfläche gedrückt wird, wird der Controller für die geteilte Ansicht aus der Übersichtsansicht entfernt und eine andere Ansicht wird an ihre Stelle gesetzt. Eine Symbolleisten-Schaltfläche auf dieser neuen Ansicht entfernt die Ansicht und setzt die geteilte Ansicht zurück. Funktioniert prima... außer wenn das iPad gedreht wird, während die zweite Ansicht sichtbar ist. Wenn der Benutzer zur geteilten Ansicht zurückkehrt, wird sie so angezeigt, wie sie vor der Drehung war.

Die geteilte Ansicht und alle Unteransichten sind auf autoresize=yes eingestellt und geben yes zurück, wenn sie die Meldung autorotatetointerfaceorientation erhalten.

Ich vermute, ich muss der geteilten Ansicht und ihren Unteransichten mitteilen, dass sie ihre Größe ändern sollen, wenn ich sie als Unteransicht zum Fenster hinzufüge.

Danke Chris

0voto

Simon Goldeen Punkte 9030

Ok, ich habe eine Idee, was funktionieren könnte: Entfernen Sie die Ansicht des UISplitViewControllers nicht aus der Ansichtshierarchie. Setzen Sie stattdessen entweder einen View darüber, setzen Sie die alpha Eigenschaft seiner Ansicht auf 0 oder setzen Sie die hidden Eigenschaft seiner Ansicht auf YES.

0voto

occulus Punkte 16846

Bitte beachten Sie meine Frage zu diesem Thema hier:

Beste Möglichkeit, zwischen UISplitViewController und anderen Viewcontrollern zu wechseln?

Wenn Sie den UISplitViewController so verwenden, wie Apple es beabsichtigt, ist er ziemlich eingeschränkt.

Ich endete mit einer Strategie genau wie Sie erwähnen - d.h. entfernen Sie die UISplitViewController-Ansicht von UIWindow, und ersetzen Sie mit einem anderen, und dann später zurück wechseln. Ich fand heraus, dass die Orientierungsänderung behandelt wurde, auch wenn ich gedreht, während Ansicht B dargestellt wurde (B ist die nicht geteilte Ansicht), dann wechseln Sie zurück zu A (die geteilte Ansicht). Allerdings musste ich ein wenig an der Rahmengröße der geteilten Ansicht herumschrauben, damit es funktionierte. Ich werde später mit mehr Informationen aktualisieren, wenn ich sie finde.

Es gibt auch die Möglichkeit, einen eigenen Split-View-Controller zu schreiben oder die Neuimplementierung eines anderen Anbieters zu verwenden, wie z. B. diesen:

http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad

アップデイト

Die Fummelei, die ich mit der Rahmengröße von UISplitView gemacht habe, ist in der folgenden Methode in meinem AppDelegate zu sehen. Diese Methoden dienen der Darstellung des Split View Controllers, indem sie einen anderen Top-Level View Controller unter UIWindow ersetzen:

- (void)removeAllWindowSubviews {
    for (UIView *childView in window.subviews) {
        [childView removeFromSuperview];
    }
}

- (void)presentSplitView:(UISplitViewController *)vc {
    [self removeAllWindowSubviews];

    UIView *viewForSplitVC = vc.view;

    // fix for deficiency in adding a split view controller's view in landscape mode
    // and it still having a frame for portrait mode.
    // 2010-10-15 added -20.0f to fix problem with toolbar in LHS VC being 20 pix too low. 
    viewForSplitVC.frame = CGRectMake(viewForSplitVC.frame.origin.x, viewForSplitVC.frame.origin.y, 
                              navigationController.view.bounds.size.width, navigationController.view.bounds.size.height - 20.0f);    

    [window addSubview:viewForSplitVC];
}

// for removing the split view and restoring the other main VC
- (void)restoreMenu {
    if (isIPad()) {
        [self removeAllWindowSubviews];

        [window addSubview:navigationController.view];      
    }
}

Wie gesagt, es ist ein Hack, aber die Korrektur des Rahmens gab mir die Möglichkeit, die geteilte VC zu präsentieren, ohne dass der Rahmen manchmal falsch ist. Und wie ich bereits erwähnt habe, gehen wir damit über das hinaus, was Apple von uns verlangt, daher die Hackerarbeit.

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