Xcode / iOS: Как скрыть навигацию и панель инструментов при прокрутке вниз?

Я хотел бы скрыть обе полосы при прокрутке вниз на моем iPhone. Когда я прокручиваю вверх, они должны появиться снова.. Как я могу с этим справиться?

4 ответов


принятый ответ не работает для меня, так как scrollViewWillBeginScroll: не является методом делегата.

вместо этого я делаю

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BarsShouldHide" object:self];

}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView 
                 willDecelerate:(BOOL)decelerate
{
    if(!decelerate)
        [[NSNotificationCenter defaultCenter] postNotificationName:@"BarsShouldUnhide" 
                                                            object:self];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"BarsShouldUnhide"
                                                        object:self];
}

в любом месте приложения объекты могут слушать это уведомление, как

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserverForName:@"BarsShouldHide" 
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {
        //hide tab bar with animation;
    }];
    [[NSNotificationCenter defaultCenter] addObserverForName:@"BarsShouldUnhide" 
                                                      object:nil
                                                       queue:nil
                                                  usingBlock:^(NSNotification *note) {
        //Unhide tab bar with animation;
    }];
}

этот код скроет полосы для любого прокрутки. если вы хотите иметь только вниз, то же самое locationOffset трюк, как в принятом ответе, должен работать.


- (void)scrollViewWillBeginScroll :(UIScrollView *)scrollView {
      if (scrollView.contentOffset.y < lastOffset.y) {
                 [toolBar setHidden:YES];
                 [[[self navigationController] navigationBar] setHidden:YES];
      } else{
                 // unhide
      }
}

- (void)scrollViewDidScroll :(UIScrollView *)scrollView {
      /// blah blah
      lastOffset = scrollView.contentOffset;
}

Примечание : lastOffset это CGPoint и он идет в свой заголовочный файл: @Interface.


вот мое решение в Swift; он работает красиво

func scrollViewDidScroll(scrollView: UIScrollView) {
    let navController: UINavigationController = self.navigationController!
    if self.collectionView.panGestureRecognizer.translationInView(self.view).y <= 0.0 {
        defaultCenter.postNotificationName("stuffShouldHide", object: self)
    } else {
        defaultCenter.postNotificationName("stuffShouldUnhide", object: self)
    }
}

вы можете проверить это, доступное из iOS8, я думаю, что это обратная сторона того, что вы ищете...но стоит проверить, как это что-то стандартное, и именно так работает Safari.

Свифт

var hidesBarsOnSwipe: Bool

С

@свойство (неатомное, readwrite, assign) BOOL hidesBarsOnSwipe Обсуждение

Если для этого свойства задано значение да, прокрутка вверх скрывает навигацию бар и панель инструментов. Нисходящий свайп снова показывает оба бара. Если панель инструментов не имеет элементов, она остается видимой даже после сильный удар. По умолчанию это свойство имеет значение NO.