webentwicklung-frage-antwort-db.com.de

Orientierung in einer UIView, die einem UIWindow hinzugefügt wurde

Ich habe ein UIView, das das gesamte Gerät (UIWindow) abdecken soll, um das Vergrößern/Verkleinern von Bildern zu unterstützen. Dabei verwende ich eine Core-Animation, bei der ein Benutzer eine Schaltfläche auf einer UITableViewCell antippt und ich das zugehörige Bild zoome.

Das Zoomen funktioniert einwandfrei. Was ich nicht herausfinden konnte, ist, warum sich die Unteransicht immer noch im Hochformat befindet, obwohl sich das Gerät im Querformat befindet. Eine Abbildung unten:

enter image description here

Ich habe einen Navigationscontroller, aber diese Ansicht wurde direkt zum UIWindow hinzugefügt.

44
Ken

Einige mögliche Ursachen können Sie hier nachlesen:
Technische Fragen und Antworten QA1688 - Warum dreht sich mein UIViewController nicht mit dem Gerät?

In Ihrer Situation ist es wahrscheinlich die Tatsache, dass Sie die Ansicht als weitere Unteransicht zum Fenster hinzufügen. Nur die erste Unteransicht erhält die Rotationsereignisse. Sie können es als Unteransicht der ersten Fensterunteransicht hinzufügen.

UIWindow* window = [UIApplication sharedApplication].keyWindow;
if (!window) 
    window = [[UIApplication sharedApplication].windows objectAtIndex:0];
[[[window subviews] objectAtIndex:0] addSubview:myView];    
121
dizy

Das Problem

Ab iOS 6 beteiligt sich nur der oberste Ansichtscontroller (neben dem UIApplication-Objekt) an der Entscheidung, ob in .__ gedreht werden soll. Reaktion auf eine Änderung der Ausrichtung des Geräts.

https://developer.Apple.com/library/content/qa/qa1688/_index.html

Die Lösung

Ich habe einen Pod mit dem Namen AGWindowView in den Open-Source-Modus aufgenommen.
Es werden automatisch alle Rotationen und Rahmenänderungen vorgenommen, sodass Sie sich keine Sorgen machen müssen.

Der Code

Es unterstützt jede Kombination von SDKs und iOS-Systemversionen. Den entsprechenden Code finden Sie hier: https://github.com/hfossli/AGWindowView/blob/master/Source/AGWindowView.m

83
hfossli

Ich habe eine Kategorie für UIApplication erstellt, die über eine Hilfseigenschaft und eine Methode zum Abrufen der ersten Unteransicht des keyWindow verfügt. Dies ist die Ansicht, die Sie trotzdem überlagern möchten. Wenn Sie nun eine Ansicht hinzufügen, die von einem UIViewController dieser Ansicht verwaltet wird, wird die Methode shouldRotateToInterfaceOrientation: aufgerufen. 

UIApplication + WindowOverlay.h 

#import <UIKit/UIKit.h>

@interface UIApplication(WindowOverlay)

    @property (nonatomic, readonly) UIView *baseWindowView;

    -(void)addWindowOverlay:(UIView *)view;

@end

UIApplication + WindowOverlay.m 

#import "UIApplication+WindowOverlay.h"

@implementation UIApplication(WindowOverlay)

    -(UIView *)baseWindowView{
        if (self.keyWindow.subviews.count > 0){
            return [self.keyWindow.subviews objectAtIndex:0];
        }
        return nil;
    }

    -(void)addWindowOverlay:(UIView *)view{
        [self.baseWindowView addSubview:view];
    }
@end

und so würden Sie es verwenden. 

//at the top of the file...or in {yourproject}.pch
#import "UIApplication+WindowOverlay.h

//in a method:

UIView *view = [UIView new];

UIView *window = [UIApplication sharedApplication].baseWindowView;

view.frame = window.bounds;

[window addSubview:view];

//or

[[UIApplication sharedApplication] addWindowOverlay:view];
4
Jon

Dies ist darauf zurückzuführen, dass Ihre Ansicht direkt zum UIWindow hinzugefügt wurde. Wenn also die Methode zum Drehen für den Navigationscontroller aufgerufen wird, passiert der Uiview nichts. Die UIView würde sich drehen, wenn es sich um eine Unteransicht der View Controller-Ansicht handelt. Wenn dies aus irgendeinem Grund nicht möglich ist. Dann könnten Sie diese Methode überschreiben:

// This method is called every time the device changes orientation
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
}

Und jedes Mal, wenn sich Ihre Ausrichtung ändert, ändern Sie auch Ihre Ansichtsausrichtung.

1
Oscar Gomez

Ich hatte ein ähnliches Problem mit Ansichten, die direkt einem Fenster hinzugefügt wurden. Vielleicht hilft dies: Automatische Anpassung der UIView nach dem Hinzufügen zum Fenster

0

Eine andere Lösung, wie ich dieses Problem gelöst habe.

Definieren Sie die aktuelle Ausrichtung:

@interface AJImageCollectionViewController (){
    UIInterfaceOrientation _currentOrientation;
}
@end

Überprüfen Sie dann die Ausrichtung in viewWillLayoutSubviews:

- (void)viewWillLayoutSubviews {
    [self checkIfOrientationChanged];
}

- (void)checkIfOrientationChanged {
    UIInterfaceOrientation newOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    BOOL newOrientationIsPortrait = UIInterfaceOrientationIsPortrait(newOrientation);
    BOOL oldOrientationIsPortrait = UIInterfaceOrientationIsPortrait(_currentOrientation);

    // Check if the orientation is the same as the current
    if(newOrientationIsPortrait != oldOrientationIsPortrait){
        _currentOrientation = newOrientation;
        // Do some stuff with the new orientation
    }
}
0
Antoine