3

Ich habe eine UIView, die das gesamte Fenster auf dem iPhone einnimmt. Wenn es sich in die Landschaft dreht, erhalten die Kanten die kleinen schwarzen Balken, bis sie einrasten, wie ich es erwarten würde.Kann ich eine UIView ohne die schwarzen Balken drehen?

Ich möchte diese Ansicht größer machen als den Bildschirm, so dass das Drehen nicht die schwarzen Balken zeigt, sondern die Teile der Ansicht zeigt, die normalerweise außerhalb des Bildschirms liegen. Ich habe versucht, den Rahmen und die Grenzen der Ansicht zu vergrößern, aber das scheint den Trick nicht zu machen.

Hat jemand das erfolgreich gemacht?

Antwort

2

Sie müssen zwei Dinge tun, um dies zu erreichen.

Zuerst wird die Ansicht des Fenster-Root-View-Controllers immer auf die Größe des Fensters skaliert. Ihre große Ansicht muss also eine Unteransicht der Ansicht des Stammansicht-Controllers sein (damit sie nicht verkleinert wird), und die Ansicht Ihres Stammansicht-Controllers muss clipsToBounds auf NO gesetzt haben. Tatsächlich müssen alle Vorfahren der großen Ansicht clipsToBounds auf NO gesetzt haben.

Zweitens, wenn das Fenster rotiert, gibt es sich schwarze Subviews, um alle Ansichten explizit zu verstecken, die sonst außerhalb der Grenzen des Fensters erscheinen würden. Es platziert diese schwarzen Subviews vor der Ansicht des Root-View-Controllers. Sie benötigen Root-View-Controller-Sicht nach vorne bewegen, wie folgt aus:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow *window = self.view.window; 
    [window bringSubviewToFront:window.rootViewController.view]; 
} 
2

Ich fand eine alternative Art und Weise, die funktioniert, wenn Sie zwei UIWindows haben überlappen. (Dies kann der Fall sein, wenn Sie nicht drehbaren Inhalt im Hintergrund haben möchten, mit einem drehbaren Interface oben). Die Idee besteht darin, direkt nach den schwarzen Balkenuntersichten im vordersten UIWindow zu suchen, wenn willAnateRotationToInterfaceOrientation aufgerufen wird, und diese explizit auszublenden . Der folgende Code sucht zwei Ebenen tief:

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration { 
    UIWindow* window = self.view.window; 
    for (UIView* view in [window subviews]) { 
     if (!CGRectIntersectsRect(window.bounds, view.frame)) { 
      view.hidden = YES; 
     } 

     for (UIView* view_ in [view subviews]) { 
      CGRect frame = [view_ convertRect:view_.frame toView:window]; 
      if (!CGRectIntersectsRect(window.bounds, frame)) { 
       view_.hidden = YES; 
      } 
     } 
    } 
} 
+0

Das funktioniert gut für mich. – David

0

Ich arbeite derzeit an einer App, die den Bildschirm erfordert, um langsamer als Standardgeschwindigkeit zu drehen. Um zu verhindern, dass das schwarze Rotationsrechteck die Ansicht schneidet (bei der Standardrotationsgeschwindigkeit), bevor meine eigene Rotation begann, habe ich einfach das Kästchen neben Allgemein -> Einsatzinfo -> Erfordert Vollbild angeklickt.

enter image description here

Ich habe auch die Statusleiste auf dem View-Controller versteckt, obwohl die Statusleiste ausgeblendet Box nicht aktiviert ist.

0

UINavigationController und UITabBarController haben beide Systemuntersichten (UINavigationController: UINavigationTransitionView; UITabBarController: UITransitionView und UIViewControllerWrapperView), bei denen layer.masksToBounds standardmäßig auf YES gesetzt ist. Um die schwarzen Kanten während der Drehung zu eliminieren, müssen Sie diese und alle anderen hierarchischen Ansichten auf none setzen.

Ich bin mir jedoch nicht sicher, was die Änderung der Layer der oben genannten Systemansichten bewirkt, daher empfehle ich, ihre layer.masksToBounds auf YES zurückzusetzen, sobald Sie mit der Animation fertig sind.