2011-01-16 21 views
8

Uygulamam yalnızca manzara doğru yönünü destekliyor.Animasyonlu geçiş yatay yönde düzgün çalışmaz

Görünüm denetleyicinin görünümüne geçiş yapmaya çalışıyorum, ancak geçiş animasyonunu gerçekleştirdiğinde (kıvrılma gibi), görünüm 90 derece döndürülür (böylece, simülatör hala yatay yönde oryantasyondadır, ancak görünüm 90 derece döndürülür). Geçiş bittiğinde, doğru yönlendirmeye döner. Kodum aşağıda.

- (IBAction)buttonTouched 
{ 
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 

    [UIView transitionFromView:self.view 
         toView:aViewController.view 
         duration:2 
         options:UIViewAnimationOptionTransitionCurlUp 
        completion:NULL]; 
} 

almaz görünüm bildirim "yönünü değiştirdi" Öyle görünüyor, bu yüzden portre bunu sunar ve sonra animasyon bittikten sonra yatay değiştirir. IB'de kurdum, böylece her şey peyzajda ortaya konuldu.

DÜZENLEME: Ayrıca, kendi Kendine ait IB dosyasına bir Görünüm Denetçisi eklemeyi ve bu görünüme geçiş yapmayı denedim (belki de başlatma ve geçiş arasında çok yakın olduğunu düşünüyorum) ama aynı şey gerçekleşti.

cevap

16

Asıl neden, self.view'in (şu anda manzarada olduğunuzu "bildiği") yerini, bu bilgiye sahip olmayan yeni bir görünümle değiştirmesidir. Bu yüzden bir düşünce, bir viewController.view öğesini subview of self.view olarak koymaktır (aViewController'ın opak olduğunu varsayarsak). Ah, diyorsun ama ben geçişin güzel animasyonunu kaybediyorum. Eh, bu incelik deneyin:

[UIView transitionWithView:self.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       animations:^{ 
        [self.view addSubview:aViewController.view]; 
       } 
       completion:NULL]; 

sizin için çalışmıyor nedense, alternatif gerçekten yatay görünüm olduğunu aViewController.view "öğretmek" için ise:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 
-(void)setNewViewToLandscape:(UIView*)viewObject { 
    //assumes self.view is landscape and viewObject is portrait 
    [viewObject setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)]; 
    CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
    viewObject.transform = cgCTM; 
    viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
} 

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 
[self setNewViewToLandscape:aViewController.view]; 

[UIView transitionFromView:self.view 
        toView:aViewController.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       completion:NULL]; 

Bir küçük ek nokta aViewController sızıyor, bu nedenle ana viewController korunan bir özellik yapmalısınız.

+0

Wow ... harika cevap. Teşekkürler! – Ned

+0

Gerçekten önemli bir cevap, günümü kurtardı! – BootMaker

+0

Günümü de kurtardım, ikinci seçenekte küçük bir yazım hatası var: [self setViewToLandscape: aViewController.view]; olmalıdır: [self setNewViewToLandscape: aViewController.view]; adlandırma kuralınızı kullanarak. Ayrıca eğer yeni görüntü denetleyiciniz manzaradaysa, burada sadece takas genişliği ve yüksekliği: [viewObject setCenter: CGPointMake (self.view.frame.size.width/2, self.view.frame.size.height/2)]; (bunu düzgün bir şekilde ortalayacaktır. – Dado

İlgili konular