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

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

Ответ 1

Принятый ответ не работает для меня, поскольку 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, что и в принятом ответе, должен работать.

Ответ 2

- (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.

Ответ 3

Здесь мое решение в 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)
    }
}

Ответ 4

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

Свифта

var hidesBarsOnSwipe: Bool

Objective-C

@property (nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe Обсуждение

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