Ios 向下滚动时隐藏UiWebView底部的工具栏

Ios 向下滚动时隐藏UiWebView底部的工具栏,ios,uiwebview,Ios,Uiwebview,我有以下代码,当不在web视图的顶部时,它成功地隐藏了底部工具栏,如所附图像所示。(下文) 我试图做的是完全隐藏工具栏,然后展开web视图以占用额外的空间(类似于Safari的做法)。任何帮助都会很好 - (void)viewDidLoad { [super viewDidLoad]; if (self.url != nil) { [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL U

我有以下代码,当不在web视图的顶部时,它成功地隐藏了底部工具栏,如所附图像所示。(下文)

我试图做的是完全隐藏工具栏,然后展开web视图以占用额外的空间(类似于Safari的做法)。任何帮助都会很好

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (self.url != nil)
    {
        [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[StoreWebViewController checkAndPrependProtocolForUrl:self.url]]]];
        self.webView.delegate = self;
    }

    for (id subview in self.webView.subviews)
    {
        if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        {
            UIScrollView * s = (UIScrollView*)subview;
            originalDelegate = s.delegate;
            s.delegate = self;
            break;
        }
    }
}


- (void)scrollViewDidScroll :(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y == 0) //Show toolbar when at top
    {
        [self.toolbar setHidden:NO];
    }
    else
    {
        [self.toolbar setHidden:YES];
    }
    [originalDelegate scrollViewDidScroll: scrollView];
}


我在一个应用程序中使用了文本区域,所以我认为用webView替换textView也是一样的

初始化方向和标志

@implementation YourViewController{
    BOOL tap;
    BOOL hideNav;
    BOOL mustShowNav;
}

@synthesize webView;

typedef enum ScrollDirection {
    ScrollDirectionNone,
    ScrollDirectionRight,
    ScrollDirectionLeft,
    ScrollDirectionUp,
    ScrollDirectionDown,
} ScrollDirection;
viewDidLoad

- (void)viewDidLoad 
{
    webView.delegate = self;
    hideNav = NO;
    mustShowNav = NO;

    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(webViewTapped:)];
    gestureRecognizer.delegate = self;
    [self.webView addGestureRecognizer:gestureRecognizer];
}
滚动条

- (void)scrollViewDidScroll:(UIScrollView*)scrollView
{
    ScrollDirection scrollDirection;

    if (lastContentOffset.y < scrollView.contentOffset.y)
        scrollDirection = ScrollDirectionDown;
    else
        scrollDirection = ScrollDirectionUp;


    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (scrollDirection == ScrollDirectionDown && scrollView.contentOffset.y > 50 && !mustShowNav) {
        hideNav = YES;
        tap = 0;
    } else {
        hideNav = NO;
    }

    if (scrollDirection == ScrollDirectionUp && mustShowNav){
        hideNav = NO;
        mustShowNav = NO;
    }

    if (scrollDirection == ScrollDirectionDown && endScrolling > scrollView.contentSize.height - 50 && !mustShowNav) {
        mustShowNav = YES;
    }

    [[self navigationController] setToolbarHidden:hideNav animated:YES];
    lastContentOffset = scrollView.contentOffset;

    [originalDelegate scrollViewDidScroll: scrollView];
}

希望这对您有所帮助。

最好的解决方案是让您的Javascript触发这些事件,宿主视图控制器应该处理它们。

出于某种原因(不确定原因),我不得不将lastContentOffset=scrollView.contentOffset移到末尾,并且我不得不添加一些委托实现。也许你可以解释为什么将lastContentOffset移到末尾会产生不同。(我不明白为什么会这样,因为它只是一个变量)这似乎是因为[[self-navigationController]SetToolbar Hidden:hideNav animated:YES]。它必须改变偏移值…请确认这是它听起来奇怪的原因,但也许你是对的。我将在我的应用程序中看到它,并向您更新。我认为它完全相同,我没有注意到任何差异,尽管我做了几次测试。正如您所说的,它只是一个变量,因此当修改它时,新值将在下一次调用
scrollViewDidScroll
时使用。当然,由于
setToolbarHidden
的原因,可能会有轻微的不同行为,但不会干扰用户。在我的应用程序中,工具栏从不隐藏,这会造成不同。
- (void)webViewTapped:(id)sender
{
    if(!tap){
        hideNav = NO;
        tap = 1;
    } else {
        hideNav = YES;
        tap = 0;
    }
    [[self navigationController] setToolbarHidden:hideNav animated:YES];
}