2012-08-25 5 views
5

Ich habe eine UIView, die programmatisch erstellt wird ist:Wie Rotation für einen programmatisch erzeugt UIView erkennen

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 
    if (self) { 
     self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.5]; 

     UIImageView* closeButton = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"modal_close.png"]]; 

     closeButton.frame = CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09, closeButton.frame.size.width, closeButton.frame.size.height); 

     UIButton* button = [[UIButton alloc] initWithFrame:CGRectMake(self.frame.size.width*.89, self.frame.size.height*.09,20, 20)]; 

     [button addTarget:self action:@selector(close) forControlEvents:UIControlEventTouchUpInside]; 

     UIView* mainView = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width*.1,self.frame.size.height*.1,self.frame.size.width*.8,self.frame.size.height*.8)]; 

     mainView.backgroundColor = [UIColor whiteColor]; 
     _displayMainView = mainView;   

     [self addSubview:_displayMainView]; 
     [self addSubview:closeButton]; 
     [self addSubview:button]; 

     mainView = nil; 
     closeButton = nil; 
    } 
    return self; 
} 

Wie kann ich Rotation erkennen? Dies soll als ein Modal über einer anderen vorhandenen Ansicht wirken. Dies ist eine iPad-App, wenn das wichtig ist.

+0

Haben Sie die UIView der Drehwinkel oder die Ausrichtung des Geräts bedeuten? –

+0

Sehen Sie diese ausgezeichnete Antwort - http://stackoverflow.com/a/3897243/194544 – beryllium

Antwort

5

Ich glaube, Sie haben zwei Möglichkeiten:

  1. Sie legen den Blick in einer benutzerdefinierten UIViewController und überschreiben die shouldAutorotateToInterfaceOrientation: Methode JA zurückzukehren für alle Orientierungen Sie unterstützen möchten. Der View-Controller wird den Inhalt (Ihre Ansicht) automatisch drehen und seine Größe ändern. Sie müssen nur sicherstellen, dass Sie die richtige autoresizeMask haben (oder Einschränkungen, wenn Sie das automatische Layout verwenden).
  2. Mit dem Beschleunigungssensor können Sie Änderungen an der Geräteausrichtung direkt beobachten. Dann können Sie Ihre Ansicht bei Bedarf anpassen.

Es ist wirklich die erste Annäherung, die Sie wählen sollten, wenn Sie können.

42

Sie das Gerät zu erzeugen Rotation Benachrichtigungen erhalten könnte zu starten: für eine Vorrichtung Dreh Benachrichtigung

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

Fügen Sie Ihre eigenen Wähler als Beobachter:

 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceOrientationDidChange:) name: UIDeviceOrientationDidChangeNotification object: nil]; 

Und dann Ihre Benachrichtigungs-Handler schreiben

- (void)deviceOrientationDidChange:(NSNotification *)notification { 
    //Obtain current device orientation 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

     //Do my thing 
} 

Denken Sie daran, den Beobachter bei der Dealloc-Methode zu entfernen Ihrer benutzerdefinierten UIView wird aufgerufen (oder wenn Sie fertig sind) und hört auf, auch die Geräteänderungsbenachrichtigungen zu generieren.

-(void) dealloc{ 
[[NSNotificationCenter defaultCenter] removeObserver: self]; 
[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 
} 

Hilft das überhaupt bei Ihrer Frage?

+0

Verwenden Sie dies nicht, da es den Beschleunigungsmesser des Geräts aktiviert. Der Beschleunigungssensor bleibt aktiv, bis Sie 'endGeneratingDeviceOrientationNotifications' aufrufen. Wenn es sich bei Ihrer Ansicht jedoch um eine Zellenansicht handelt, wird sie erst dann freigegeben, wenn Sie die Tabellenansicht freigeben (was wahrscheinlich nie passieren wird). Sie können stattdessen 'if UIScreen.main.bounds.height> UIScreen.main.bounds.width' verwenden. –

3

Ich Umschreiben @ clearwater82 Antwort für Swift 3 seit seinem Ansatz ist der, den ich am Ende mit:

ich den folgenden Code hinzugefügt init Methode in meiner Sicht (für einen Controller es in seinem viewDidLoad Methode wäre):

// Handle rotation 
UIDevice.current.beginGeneratingDeviceOrientationNotifications() 
NotificationCenter.default.addObserver(
    self, 
    selector: #selector(self.orientationChanged(notification:)), 
    name: NSNotification.Name.UIDeviceOrientationDidChange, 
    object: nil 
) 


ich habe dann die orientationChanged Methode meiner Sicht. Sie können diese Methode umbenennen, wie Sie wollen, nur nicht vergessen, auch sie im Snippet oben Code umbenennen:

// Called when device orientation changes 
@objc func orientationChanged(notification: Notification) { 
    // handle rotation here 
} 


Schließlich habe ich die deinit Verfahren unnötige Meldungen zu entfernen, wenn die Ansicht entfernt wird:

deinit { 
    NotificationCenter.default.removeObserver(self) 
    UIDevice.current.endGeneratingDeviceOrientationNotifications() 
} 

Was diese letzte Schnipsel tut, ist der Ansicht, sich von den Benachrichtigungs Beobachter zu entfernen und dann von der Generierung anderen Dreh Meldungen das Gerät zu stoppen. Dieser Ansatz war das, was ich brauchte, aber Sie möchten möglicherweise nicht verhindern, dass die Benachrichtigungen generiert werden, wenn die Ansicht entfernt wird.

Ich hoffe, dies nützlich, prost

Verwandte Themen