SORU
1 Aralık 2013, Pazar


Gezinti kontrol düzeni özel geçiş ile onur kılavuzu üst

Kısa versiyon:

Özel geçiş ve iOS7 UINavigationController ile birlikte kullanıldığında, otomatik düzen üstüne düzen kılavuzu ile ilgili bir sorun yaşıyorum. Özellikle, üst düzen kılavuzu ve metin görünümü arasında kısıtlaması layık değildir. Herkes bu sorunla karşılaştı mı?


Uzun versiyon:

Açıkça şu şekilde: bir görünümü oluşturan kısıtlamaları (örneğin, üst, alt), sol ve sağ tanımlamak olan bir sahne var

right

Ama ne zaman kullanırım bu özel geçiş üzerinde gezinti kontrol cihazı, üst kısıtlama üst düzen kılavuzu görünüyor ve işler aşağıdaki gibidir, gibi üst düzen kılavuzu vardı üstünde ekran yerine dibinde gezinti kontrol:

wrong

"Gezinti kontrol özel geçiş işe karışmış oluyor. üst düzen kılavuzu görünüyor Kısıtlamalar sonuna doğru uygulanır. Ve ben cihazı döndürün ve tekrar döndürmek için her şeyi kısıtlamaları düzgün tanımlı değil bir sorun olduğu görünmüyor aniden düzgün işlenmiş. Benim özel geçiş kapattığımda aynı şekilde, görüşlerini doğru oluştur.

Bu, _autolayoutTrace dedi UILayoutGuide nesneleri çalıştırdığımda AMBIGUOUS LAYOUT, muzdarip olduğunu bildiriyor:

(lldb) po [[UIWindow keyWindow] _autolayoutTrace]

Ama bu düzen kılavuzları her zaman bildirildiği gibi belirsiz zaman baksam onlara rağmen aldım sağlayan şey yok eksik kısıtlamaları (yaptım alışılmış seçme görünümü denetleyicisi ve seçerek "Add eksik kısıtlamaları için Görünüm denetleyicisi" veya seçerek, tüm kontrolleri ve aynı yapmak için onları).

Geçiş yapıyorum nasıl açısından, animationControllerForOperation yöntemi UIViewControllerAnimatedTransitioning uygun bir nesne belirtilen ettim:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController*)fromVC
                                                 toViewController:(UIViewController*)toVC
{
    if (operation == UINavigationControllerOperationPush)
        return [[PushAnimator alloc] init];

    return nil;
}

Ve

@implementation PushAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.5;
}

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

    [[transitionContext containerView] addSubview:toViewController.view];
    CGFloat width = fromViewController.view.frame.size.width;

    toViewController.view.transform = CGAffineTransformMakeTranslation(width, 0);

    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
        fromViewController.view.transform = CGAffineTransformMakeTranslation(-width / 2.0, 0);
        toViewController.view.transform = CGAffineTransformIdentity;
    } completion:^(BOOL finished) {
        fromViewController.view.transform = CGAffineTransformIdentity;
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];
}

@end

Ayrıca yukarıdaki yorumu yaptım, aynı sonucu transform yerine görünümü frame ayarı verdim.

El ile de kısıtlar layoutIfNeeded çağırarak yeniden uygulandığından emin olun denedim. Ayrıca setNeedsUpdateConstraints, setNeedsLayout vb denedim.

Hat, herkes başarılı bir şekilde gezinti kontrol özel geçiş evlendi üst düzen kılavuzu kullanım kısıtlamaları ile alt?

CEVAP
17 ŞUBAT 2015, Salı


topLayoutGuide yükseklik kısıtlaması sabitleme tarafından çözüldü. edgesForExtendedLayout ayarlamayı hedef görünümü gezinti çubuğu underlap için, ama aynı zamanda düzen subviews topLayoutGuide kullanarak mümkün olması gerektiği gibi benim için bir seçenek değildi.

Doğrudan oyun kısıtlamaları teftiş iOS değeri ile topLayoutGuide gezinti denetleyicisi gezinti çubuğu yüksekliği eşit boy kısıtlaması ekleyen gösterir. Dışında, 7, özel animasyon geçiş kullanarak iOS 0 yükseklik kısıtlaması kalkıyor. İOS 8'de bu tamir ettiler.

Bu kadar kısıtlama (Swift ama eşdeğer N-C çalışması gerekir) düzeltmek için geldim çözümdür. İOS 7 ve 8 üzerinde çalıştığını test ettim.

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let fromView = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!.view
    let destinationVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    destinationVC.view.frame = transitionContext.finalFrameForViewController(destinationVC)
    let container = transitionContext.containerView()
    container.addSubview(destinationVC.view)

    // Custom transitions break topLayoutGuide in iOS 7, fix its constraint
    if let navController = destinationVC.navigationController {
        for constraint in destinationVC.view.constraints() as [NSLayoutConstraint] {
            if constraint.firstItem === destinationVC.topLayoutGuide
                && constraint.firstAttribute == .Height
                && constraint.secondItem == nil
                && constraint.constant == 0 {
                constraint.constant = navController.navigationBar.frame.height
            }
        }
    }

    // Perform your transition animation here ...
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bethliebert

    bethliebert

    23 EKİM 2008
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • Tire Rack

    Tire Rack

    31 Mayıs 2007