SORU
6 Kasım 2013, ÇARŞAMBA


İOS 7 Facebook/göster/Akit Gezinti Çubuğu genişleyen gizlemek taklit

Kullanıcı kaydırma zaman yeni iOS7 Facebook iPhone uygulaması, navigationBar yavaş yavaş tamamen yok edecek bir noktaya kendini gizler. Kullanıcı navigationBar yavaş yavaş aşağı kaydırır o zaman gösterir kendini.

Nasıl bu davranışı uygulamak. Ama hemen kaybolur ve kullanıcının kaydırma hareketi hızını hiç bağlı değil aşağıdaki çözüm olduğunun farkındayım.

[navigationController setNavigationBarHidden: YES animated:YES];

Bu "/Akit genişleyen" bir davranış. bu tarif nasıl emin değilim gibi bir yinelenen değildir umarım Önceden alkış ve teşekkür!

CEVAP
10 Ocak 2014, Cuma


Çözüm @peerless tarafından verilen büyük bir başlangıç, ama sadece sürüklemeye başlar ne zaman bir animasyon başlıyor, kaydırma hızını göz önünde bulundurmadan. Bu Facebook uygulaması olsun daha choppier bir deneyim olur. Facebook davranışı eşleştirmek için.

  • /sürükleme oranı ile orantılı bir hızda gezinti çubuğu gizlemek
  • tamamen bara kısmen gizli durur . eğer kaydırma çubuğunu gizlemek için bir animasyon başlıyor
  • bar küçülürken gezinti çubuğu öğeleri fade.

İlk olarak, aşağıdaki özellik gerekir:

@property (nonatomic) CGFloat previousScrollViewYOffset;

Ve burada UIScrollViewDelegate yöntemleri:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect frame = self.navigationController.navigationBar.frame;
    CGFloat size = frame.size.height - 21;
    CGFloat framePercentageHidden = ((20 - frame.origin.y) / (frame.size.height - 1));
    CGFloat scrollOffset = scrollView.contentOffset.y;
    CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset;
    CGFloat scrollHeight = scrollView.frame.size.height;
    CGFloat scrollContentSizeHeight = scrollView.contentSize.height   scrollView.contentInset.bottom;

    if (scrollOffset <= -scrollView.contentInset.top) {
        frame.origin.y = 20;
    } else if ((scrollOffset   scrollHeight) >= scrollContentSizeHeight) {
        frame.origin.y = -size;
    } else {
        frame.origin.y = MIN(20, MAX(-size, frame.origin.y - scrollDiff));
    }

    [self.navigationController.navigationBar setFrame:frame];
    [self updateBarButtonItems:(1 - framePercentageHidden)];
    self.previousScrollViewYOffset = scrollOffset;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self stoppedScrolling];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                  willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        [self stoppedScrolling];
    }
}

Ayrıca bu yardımcı yöntemler gerekir:

- (void)stoppedScrolling
{
    CGRect frame = self.navigationController.navigationBar.frame;
    if (frame.origin.y < 20) {
        [self animateNavBarTo:-(frame.size.height - 21)];
    }
}

- (void)updateBarButtonItems:(CGFloat)alpha
{
    [self.navigationItem.leftBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem* item, NSUInteger i, BOOL *stop) {
        item.customView.alpha = alpha;
    }];
    [self.navigationItem.rightBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem* item, NSUInteger i, BOOL *stop) {
        item.customView.alpha = alpha;
    }];
    self.navigationItem.titleView.alpha = alpha;
    self.navigationController.navigationBar.tintColor = [self.navigationController.navigationBar.tintColor colorWithAlphaComponent:alpha];
}

- (void)animateNavBarTo:(CGFloat)y
{
    [UIView animateWithDuration:0.2 animations:^{
        CGRect frame = self.navigationController.navigationBar.frame;
        CGFloat alpha = (frame.origin.y >= y ? 0 : 1);
        frame.origin.y = y;
        [self.navigationController.navigationBar setFrame:frame];
        [self updateBarButtonItems:alpha];
    }];
}

Biraz daha farklı bir davranış için, bu yeniden pozisyon kaydırma çubuğu satırı (scrollViewDidScroll 12 *blok) değiştirin:

frame.origin.y = MIN(20, 
                     MAX(-size, frame.origin.y - 
                               (frame.size.height * (scrollDiff / scrollHeight))));

Bu son kaydırma yüzdesi, yerine daha yavaş solmaya sonuçları mutlak bir miktar dayalı çubuğu pozisyonları. Orijinal davranış daha Facebook gibi, ama bu da hoşuma gitti.

Not: Bu çözüm, iOS 7 sadece. Eğer iOS eski sürümleri destekleyen iseniz gerekli kontrolleri eklemek için emin olun.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ColdfusTion

    ColdfusTion

    3 Aralık 2007
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007