2014-12-14 43 views
5

didRotateFromInterfaceOrientation'un iOS 8'de kullanımdan kaldırıldığını anlıyorum; ancak iOS7 ile uyumlu kalması gereken bir uygulama var. Sorun şu ki, cihaz döndürüldüğünde (bu durumda iPad) bu yönteme iki kez denir. Bu, simülatörün yanı sıra gerçek bir cihazda gerçekleşir. Bunu gösterme yöntemine bir NSLog koymuştum. didRotateFromInterfaceOrientation ateşleme Döndürülmüş iki kez

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 

     NSLog(@"didRotateCalled"); 
} 

Ben de willRotateToInterfaceOrientation kontrol ettiniz ancak bir doğru yalnızca bir kez denilen alma çalışır.

didRotateFromInterfaceOrientation yönteminin her dönüşte iki kez neden ateşleneceği hakkında herhangi bir düşünce var mı?

Hızlı bir güncelleştirme olarak

. İlginç bir şeyin açığa çıktığı bir kırılma noktası koydum. Bu görünüm bir UISplitviewcontroller olup, yöntemin ilk olarak UISplitviewcontroller için ve daha sonra UIViewController olarak adlandırılmış gibi görünüyor. Emin değilim neden ...

Bazı ek bilgiler. IPhone ve diğer iPad için Storyboard'ları kullanıyorum. IPhone, splitViewController'u kullanmaz.

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

'fromInterfaceOrientation' öğesini yazdırın. Ne alıyorsun? –

+1

, kullandığınız ViewController sınıflarını ve "didRotateFromInterfaceOrientation" öğesini uyguladığınız yeri listeler.Sizin yönteminiz farklı örneklerden veya sınıf ve üst sınıftaki kodlardan çağrılabilir. – Christian

+0

Master split bir UITableViewController ve detay bölümü bir UIViewController. Ana tarafta bir hücre seçildiğinde, ayrıntı uygun içeriğe "değiştirilir". Kodumda preareForSegue'deki kurulumun üstünde görebilirsiniz. – C6Silver

cevap

3

Benim cevabım var: prepareForSegue ben aşağıdakileri yapın böylece kod tabanı paylaşılır. En yeni Xcode içinde kullanmak için iOS 7.1 için simülatörleri yeni indirdim. IOS 7.1'de çalışırken viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator yönteminin ÇALIŞMIYORUM. Bununla birlikte, iki kez rotasyon ateşleme ile tarif ettiğim sorunun iOS7'deki willRotateToInterfaceOrientation yöntemiyle OLMADIĞINI da buldum, ancak yine de iOS'ta 8 yapar. Bu, Apple'da net bir hatadır.

Müşterinin çalıştığı işletim sistemi sürümünü algılamaya ihtiyacım var gibi görünüyor ve iOS 8 veya üzeri ise, willRotateToInterfaceOrientation yönteminde herhangi bir kodu çalıştırmayacağım. Ancak, iOS 8 cihazlar için viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator yöntemini burada bırakabilirim, çünkü bu yöntem yalnızca iOS 7 tarafından göz ardı edilir.

Bunun, splitview denetleyicileri veya döndürme kullanan tüm görünüm yöntemleri için bir sorun olup olmadığını bilmiyorum iOS 7 ve 8 arasında. Uygulamanız, bu yöntemi hiçbir zaman bilmediğinizden fazla geçersiz kılmaz. Eğer öyleyse, yukarıda yaptığım şeyle yüzleşeceksin. İyi değil. Bu basitçe iOS 7 cihazları tarafından göz ardı edilir, ancak iOS 8.x tarafından ve muhtemelen yukarıda adı verilecek gibi -(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator yöntemi bırakmış

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

: Burada

Ben sürüm olup olmadığını kontrol etmek kullanıyorum kodudur .

1

Bende aynı sorun var (benim durumumda, iOS 8'de de iki kez yürütülür).

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

farklı UIViewController örnekleri karşı iki kez denilen viewWillTransition bulundu: ben aşağıdaki geçici çözümü kullandı. İlk görüşmede, benlik geçerli bir örnektir. Fakat ikinci görüşmede, benlik geçersizdir. Bu geçersiz örnekte viewDidLoad() çağrılmıyor. viewDidLoad numaralı telefona üye ve ayar değeri ekledikten sonra otomatik olarak geçerli olup olmadığını kontrol et.

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 
    } 
}