2013-09-21 13 views
16

Amacım, kullanıcılara, uygulamalar başlatılırken sıçrama tahtası simgeleriyle benzer bir görünümden yakınlaştırma yapmak için yakınlaştırma modal geçişi sağlamaktır.Gezinme çubuğu, completeTransition çağrıldıktan sonra ayarlandı: özel geçişte

Sunulan görüntü denetleyicisi doğru şekilde yakınlaştırır, ancak gezinme çubuğunun durum çubuğunun altında yanlış konumu vardır. [PositionContext completeTransition: finished]; 'den sonra bu konum düzeltilir. Geçişin başlangıcından bunu nasıl doğru yapabilirim?

Bu

hata bir ekran kaydıdır: http://youtu.be/7LKU4lzb-uw (aksaklık kaydın 6 saniyede bir)

UIViewControllerAnimatedTransitioning kodu:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIView *container = [transitionContext containerView]; 

    CGPoint viewCenter = self.view.center; 
    CGSize viewSize = self.view.frame.size; 
    CGSize controllerSize = toViewController.view.frame.size; 

    CGFloat controllerFromX = viewCenter.x - (controllerSize.width/2); 
    CGFloat controllerFromY = viewCenter.y - (controllerSize.height/2); 

    CGAffineTransform transform = CGAffineTransformMakeTranslation(controllerFromX, controllerFromY); 
    transform = CGAffineTransformScale(transform, viewSize.width/controllerSize.width, viewSize.height/controllerSize.height); 

    if (self.reverse) { 
     [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
    } else { 
     toViewController.view.transform = transform; 
     [container addSubview:toViewController.view]; 
    } 

    [UIView animateKeyframesWithDuration:ZoomTransitioningDuration 
            delay:0 
           options:0 
           animations:^{ 
       if (self.reverse) { 
        fromViewController.view.alpha = 0.0f; 
        fromViewController.view.transform = transform; 
       } else { 
        toViewController.view.transform = CGAffineTransformIdentity; 
       } 
     } 
           completion:^(BOOL finished) { 
       [transitionContext completeTransition:finished]; 
     }]; 
} 
+0

İlgili görünümün y kökenini ayarlayamıyor musunuz? –

+0

Bunu yaptığımda, durum çubuğunun altındaki alan yeşil değil, yeşil (tüm denetleyici aşağıya doğru kaydırılır). –

+0

self.view nereden geliyor? Sunum görüntüleme denetleyicisi de animasyon denetleyicisi mi? – bilobatum

cevap

25

sorun kabın içine hedef görünümü kontrolörün görünümü takmadan önce dönüşümü ayarı olmasıdır: animasyon başlamadan önce el gezinti çubuğu çerçevesini ayarlamak zorundayız.

düzeltmek gerekir sırasını Switching:

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    [container addSubview:toViewController.view]; 
    toViewController.view.transform = transform; 
} 

Bkz noktası 4 here. Gezinme denetleyicisi görünümünün alt görünüm olarak eklenmesinden önce bir dönüşüm uyguladığınızdan, düzen motoru gezinme çubuğunun pencerenin üst kenarında olduğunu düşünmez ve bu nedenle durumdan kaçınmak için ayarlanması gerekmez. bar.

+0

Benim için çalıştı! Teşekkürler! – Bivis

+0

Benim için de çalıştı! Teşekkürler! – Georg

+0

Yarım gün bir çözüm bulmaya çalıştık - mükemmel çalışıyor! – Vytis

6

oldukça rağmen, bir çözüm bulduk hacky.

if (self.reverse) { 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 
} else { 
    toViewController.view.transform = transform; 
    [container addSubview:toViewController.view]; 

    // fix navigation bar position to prevent jump when completeTransition: is called 
    if ([toViewController isKindOfClass:[UINavigationController class]]) { 
     UINavigationController* navigationController = (UINavigationController*) toViewController; 
     UINavigationBar* bar = navigationController.navigationBar; 
     CGRect frame = bar.frame; 
     bar.frame = CGRectMake(frame.origin.x, frame.origin.y + 20.0f, frame.size.width, frame.size.height); 
    } 
} 
+2

Buradaki sorun, yalnızca ilk kez sorunu çözmesidir. Daha sonra aynı görüntü denetleyicisini sunmak, nav çubuğunun da 20 piksele neden olmasını sağlar. – roperklacks

+0

iyi çalışıyor, ancak renkli gezinme çubuğu için değil. – yershuachu

+1

bar.frame = CGRectMake (frame.origin.x, frame.origin.y, frame.size.width, frame.size.height + 20.0f); çok daha iyi;) – yershuachu

0

Bu Ondřej Mirtes' birine dayalı, hala kesmek ancak bir görüşme durumunuzu çubuğu varsa daha iyi çalışır ve iOS8 konum

if([toViewController isKindOfClass:[UINavigationController class]]) { 
    UINavigationController *navCtrl = (UINavigationController *)toViewController; 
    UINavigationBar *navBar = navCtrl.navigationBar; 
    if(navBar.frame.origin.y == 0 && navBar.frame.size.height == 44) { 
    navBar.frame = CGRectMake(0, 0, navBar.frame.size.width, fmin(44 + [UIApplication sharedApplication].statusBarFrame.size.height, 64)); 
    } 
} 

çirkin olsa Kalıntıları:/

1

toViewControllerView öğesini önce ContainerView öğesine ekleyin, ardından aşağıdaki gibi toViewControllerView dönüşümünü ayarlayın.

[container addSubview: toViewController.view];

toViewController.view.transform = dönüş;

Bu, sorunu çözecektir.

İlgili konular