Iphone 滚动uiwebview时隐藏和显示导航栏

Iphone 滚动uiwebview时隐藏和显示导航栏,iphone,objective-c,xcode,navbar,Iphone,Objective C,Xcode,Navbar,我需要帮助,我正在尝试构建一个应用程序,其中我有一个带有uiwebview的viewcontroller和一个带有两个按钮的navbar。我想做的是,当用户滚动uiwebviewnavbar时,它会像向上滑动一样自动隐藏。但他们并没有按照我希望的方式工作。让我把代码贴在这里。 在viewdidload中,我放置了这个 [webPage.scrollView setDelegate:self]; 然后我有了这个方法 - (void) scrollViewDidScroll:(UIScrollVi

我需要帮助,我正在尝试构建一个应用程序,其中我有一个带有
uiwebview
viewcontroller
和一个带有两个按钮的
navbar
。我想做的是,当用户滚动
uiwebview
navbar时,它会像向上滑动一样自动隐藏。但他们并没有按照我希望的方式工作。让我把代码贴在这里。 在
viewdidload
中,我放置了这个

[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
仍然保留:(

您可以尝试以下方法:

1.声明导航栏,该导航栏是一个带有导航栏高度的常量和两个布尔变量:

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
作为子视图添加到原点处的
self.view
(同时确保
UIWebView
具有相同的原点,即(0,0))

3.实现
UIScrollViewDelegate
方法(不要忘记添加
UIScrollViewDelegate
协议):

#pragma标记-UIScrollViewDelegate方法
-(无效)scrollViewDidScroll:(UIScrollView*)scrollView
{
if(scrollView==webview.scrollView)
{
if(scrollView.contentOffset.y==1&&!WebViewScrollIsDraging&&!webViewScrollIsDecelerating)
{
[UIView animateWithDuration:0.3
延迟:0.0
选项:UIViewAnimationCurveEaseOut
动画:^(无效){
CGRect navBarFrame=CGRectMake(0,-scrollView.contentOffset.y-kNavBarHeight,self.view.bounds.size.width,kNavBarHeight);
navBar.frame=navBarFrame;
}
完成:无];
}
其他的
{
CGRect navBarFrame=CGRectMake(0,-scrollView.contentOffset.y-kNavBarHeight,self.view.bounds.size.width,kNavBarHeight);
navBar.frame=navBarFrame;
}
if(scrollView.contentOffset.y<-kNavBarHeight)
{
[webview.scrollView设置CrollIndicatorInsets:UIEdgeInsetsMake(fabsf(scrollView.contentOffset.y),0,0,0)];
}
}
}
-(无效)scrollView将开始刷新:(UIScrollView*)scrollView
{
if(scrollView==webview.scrollView)
{
WebViewScrollisDraging=是;
}
}
-(void)ScrollViewDiEndDraging:(UIScrollView*)scrollView将减速:(BOOL)减速
{
if(scrollView==webview.scrollView)
{
WebViewScrollisDraging=否;
}
}
-(无效)scrollView将开始加速:(UIScrollView*)scrollView
{
if(scrollView==webview.scrollView)
{
webViewScrollIsDecelerating=是;
}
}
-(无效)ScrollViewDiEndDecelling:(UIScrollView*)scrollView
{
if(scrollView==webview.scrollView)
{
webViewScrollIsDecelerating=否;
}
}

只要在ViewController实现文件(.m)中添加此项即可:

并且不要忘记在头文件(.h)中添加
UIScrollViewDelegate
协议:

@接口MyViewController:UIViewController
...
@结束
在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;

当向下滑动将隐藏导航栏(并成为一个透明的状态栏)时,当幻灯片显示在导航栏上时,带有动画的过程

请记住,didScroll将为每个(几乎)调用像素变化。隐藏和显示的条件将需要包含诸如偏移量- (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]; }
@interface MyViewController : UIViewController <UIScrollViewDelegate>
    ...
@end
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;