2014-01-11 14 views
4

Мне нужна помощь, я пытаюсь создать приложение, в котором у меня есть viewcontroller с uiwebview и navbar с 2 кнопками на нем. что я хочу сделать, так это то, что когда пользователь прокручивает uiwebview, навигатор автоматически скрывается, как соскользнул. но не работает так, как я хочу, чтобы он работал. позвольте мне отправить код здесь. В viewdidload Я положил это.скрыть и показать navbar при прокрутке uiwebview

[webPage.scrollView setDelegate:self]; 

, а затем у меня есть этот метод

- (void) scrollViewDidScroll:(UIScrollView *)scrollView { 
    if(scrollView.contentOffset.y == 0) { 
     //show 
     NSLog(@"Show"); 
     [self.navigationController setNavigationBarHidden:NO animated:YES]; 
    } else { 
     NSLog(@"Hide"); 
     [self.navigationController setNavigationBarHidden:YES animated:YES]; 
     //hide 
    } 
} 

это NSLog правильно, но ничего другого navbar до сих пор остается. :(

+0

Помните, что didScroll будет вызываться для каждого (почти) изменения пикселя. Условия для скрытия и отображения должны содержать неравенства, такие как offset danh

+0

так что вы предлагаете. жаль, что я новичок. :) – user2966615

ответ

4

Вы можете попробовать это:

1. Объявить панель навигации, постоянную с высотой навигации бара и 2 BOOL переменными:

UINavigationBar *navBar; 

static const CGFloat kNavBarHeight = 60.0f; 

BOOL webViewScrollIsDragging; 
BOOL webViewScrollIsDecelerating; 

2. В viewDidLoad записи следующее:

[webView.scrollView setContentInset:UIEdgeInsetsMake(kNavBarHeight, 0, 0, 0)]; 
[webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(kNavBarHeight, 0, 0, 0)]; 
[webView.scrollView setContentOffset:CGPointMake(0, -kNavBarHeight) animated:NO]; 
webView.scrollView.delegate = self; 

затем инициализируйте и добавьте UINavigationBar в качестве a subview до self.view в источнике (также убедитесь, что ваш UIWebView имеет то же происхождение, то есть (0,0)).

3. Реализовать UIScrollViewDelegate методы (Не забудьте добавить UIScrollViewDelegate протокол):

#pragma mark - UIScrollViewDelegate Methods 
- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView == webview.scrollView) 
    { 
     if (scrollView.contentOffset.y == 1 && !webViewScrollIsDragging && !webViewScrollIsDecelerating) 
     { 
      [UIView animateWithDuration:0.3 
            delay:0.0 
           options: UIViewAnimationCurveEaseOut 
          animations:^(void) { 
           CGRect navBarFrame = CGRectMake(0,-scrollView.contentOffset.y-kNavBarHeight, self.view.bounds.size.width, kNavBarHeight); 
           navBar.frame = navBarFrame; 
          } 
          completion:nil]; 
     } 
     else 
     { 
      CGRect navBarFrame = CGRectMake(0,-scrollView.contentOffset.y-kNavBarHeight, self.view.bounds.size.width, kNavBarHeight); 
      navBar.frame = navBarFrame; 
     } 

     if (scrollView.contentOffset.y < -kNavBarHeight) 
     { 
      [webview.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(fabsf(scrollView.contentOffset.y), 0, 0, 0)]; 
     } 
    } 
} 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (scrollView == webview.scrollView) 
    { 
     webViewScrollIsDragging = YES; 
    } 
} 

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (scrollView == webview.scrollView) 
    { 
     webViewScrollIsDragging = NO; 
    } 
} 

- (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    if (scrollView == webview.scrollView) 
    { 
     webViewScrollIsDecelerating = YES; 
    } 
} 

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    if (scrollView == webview.scrollView) 
    { 
     webViewScrollIsDecelerating = NO; 
    } 
} 
+1

Спасибо за помощь. – user2966615

11

Легко, как добавить это в файл реализации ViewController (.m):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.webView.scrollView.delegate = self; 
} 

#pragma mark - UIScrollViewDelegate Methods 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    self.lastOffsetY = scrollView.contentOffset.y; 
} 

- (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    bool hide = (scrollView.contentOffset.y > self.lastOffsetY); 
    [[self navigationController] setNavigationBarHidden:hide animated:YES]; 

} 

И не забудьте добавить протокол UIScrollViewDelegate в файл заголовка (.h):

@interface MyViewController : UIViewController <UIScrollViewDelegate> 
    ... 
@end 
1

В iOS8.0, а затем использовать только один код строки:

self.navigationController.hidesBarsOnSwipe = YES; 


/// When the user swipes, the navigation controller's navigationBar & toolbar will be hidden (on a swipe up) or shown (on a swipe down). The toolbar only participates if it has items. 
// @property (nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED; 

Когда сползания скроет панель навигации (и стать прозрачной госслитка), когда слайд будет отображаться на панели навигации , процесс с анимацией

Смежные вопросы