2014-12-14 14 views
5

Ich merke, dass didRotateFromInterfaceOrientation in iOS 8 veraltet ist; Ich habe jedoch eine App, die mit iOS7 kompatibel bleiben muss. Das Problem, das ich habe, ist, dass wenn das Gerät gedreht wird (iPad in diesem Fall) diese Methode zweimal aufgerufen wird. Dies geschieht sowohl auf einem tatsächlichen Gerät als auch mit dem Simulator. Ich habe einfach einen NSLog in die Methode eingefügt, um dies zu zeigen.didRotateFromInterfaceOrientation feuern Zweimal wenn gedreht

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 

     NSLog(@"didRotateCalled"); 
} 

Ich habe überprüft auch die willRotateToInterfaceOrientation aber, dass man richtig funktioniert nur einmal aufgerufen zu werden.

Irgendwelche Gedanken, warum die didRotateFromInterfaceOrientation Methode zweimal pro Umdrehung ausgelöst würde?

Als ein schnelles Update. Ich habe einen Haltepunkt gesetzt, in dem etwas Interessantes aufgedeckt wurde. Diese Ansicht ist ein UISplitviewcontroller und es sieht so aus, als ob die Methode zuerst für die UISplitviewcontroller und dann als UIViewController aufgerufen wird. Nicht sicher, warum ...

Einige zusätzliche Informationen. Ich verwende Storyboards für iPhone und das andere iPad. Das iPhone verwendet nicht die splitViewController. Die Code-Basis geteilt wird so in der prepareForSegue ich folgendes tun:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
      UISplitViewController *splitViewController = (UISplitViewController *)self.view.window.rootViewController; 
      splitViewController.delegate = segue.destinationViewController; 
} 
+0

Ausdruck der 'fromInterfaceOrientation'. Was bekommst du? –

+1

Listen Sie die ViewController-Klassen auf, die Sie verwenden und wo Sie die 'didRotateFromInterfaceOrientation' implementiert haben.Es kann sein, dass Ihre Methode von verschiedenen Instanzen oder von Code in Klasse und Superklasse aufgerufen wird. – Christian

+0

Master Split ist ein UITableViewController und der Detailbereich ist ein UIViewController. Wenn eine Zelle auf der Masterseite ausgewählt wird, wird das Detail durch den entsprechenden Inhalt ersetzt. Sie können in meinem Code über das Setup dafür in preareForSegue sehen. – C6Silver

Antwort

3

Ich habe meine Antwort. Ich habe gerade die Simulatoren für iOS 7.1 heruntergeladen, um sie im aktuellen Xcode zu verwenden. Ich habe festgestellt, dass die Methode viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator NICHT aufgerufen wird, wenn sie unter iOS 7.1 ausgeführt wird. Ich habe aber auch festgestellt, dass das Problem, das ich mit der Rotation zweimal beschrieben habe, NICHT mit der willRotateToInterfaceOrientation Methode in iOS7 passiert, sondern wieder in iOS 8. Dies ist ein klarer Fehler bei Apple.

Es sieht so aus, als müsste ich die OS-Version erkennen, die der Kunde ausführt, und wenn es iOS 8 oder höher ist, werde ich keinen Code in der willRotateToInterfaceOrientation-Methode ausführen lassen. Ich kann jedoch die viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator Methode für iOS 8 Geräte dort lassen, da diese Methode nur von iOS 7 ignoriert wird.

Ich weiß nicht, ob dies nur ein Problem für Splitviewcontrollers oder für alle View-Methoden mit Rotation ist zwischen iOS 7 und 8. Wenn Ihre App diese Methode nicht überschreibt, könnten Sie sie nie kennen. Wenn es ist, werden Sie sich dem stellen, was ich oben getan habe. Nicht gut. Hier

ist der Code, den ich für die Version zu überprüfen, bin mit:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    if (NSFoundationVersionNumber == NSFoundationVersionNumber_iOS_7_1) // use this only for iOS7 devices as otherwise this fires twice under iOS8 
    { 
     ... 
    } 
} 

ich noch habe -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator Methode, da dies einfach durch iOS 7 Geräte ignoriert werden, sondern wird von iOS 8.x und vermutlich oben genannt werden .

1

Ich habe das gleiche Problem (obwohl in meinem Fall willRotate auch auf iOS 8 zweimal ausgeführt wird). Früher habe ich die folgende Abhilfe:

BOOL _willRotate; // iVar for the state 

// Methods that should be called from willRotate/didRotate (can be inline) 
- (BOOL)workaroundIOS8RotationMethodsCalledTwice_forWillRotate_shouldExecute 
{ 
    if(_willRotate) { 
     return NO; 
    } 
    _willRotate = YES; 
    return YES; 
} 

- (BOOL)workaroundIOS8RotationMethodsCalledTwice_forDidRotate_shouldExecute 
{ 
    if(_willRotate) { 
     _willRotate = NO; 
     return YES; 
    } 
    return NO; 
} 

// Inside willRotate (return if shouldn't execute): 
if(![self workaroundIOS8RotationMethodsCalledTwice_forWillRotate_shouldExecute]) { 
    return; 
} 

// Inside didRotate (return if shouldn't execute): 
if(![self workaroundIOS8RotationMethodsCalledTwice_forDidRotate_shouldExecute]) { 
    return; 
} 
0

ich viewWillTransition genannt zweimal gegen verschiedene UIViewController Instanzen gefunden. Beim ersten Aufruf ist self eine gültige Instanz. Aber beim zweiten Aufruf ist self ungültig. viewDidLoad() wird für diese ungültige Instanz nicht aufgerufen. Ich füge ein Mitglied hinzu und setze den Wert auf viewDidLoad, dann überprüfe, ob self gültig ist oder nicht.

class MyViewControler: UIViewController { 
    var last_width:CGFloat? 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    print(" viewDidLoad self \(self) has address: \(Unmanaged.passUnretained(self).toOpaque())") 
    last_width = self.view.bounds.width 
    } 

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    print(" viewWillTransition self \(self) has address: \(Unmanaged.passUnretained(self).toOpaque())") 
    // Bug? viewWillTransition called twice with diffent self instance, ignore second call 
    if (last_width == nil || last_width == size.width) { 
     return 
    } 
    last_width = size.width 
    } 
} 
Verwandte Themen