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;