我正在开发一个浏览器应用程序,我在UIWebView上有一个地址栏。在MobileSafari上,如果向下滚动,地址栏将开始移动到屏幕外的顶部,UIWebView不会滚动。只有当地址栏完全消失时,它才会开始滚动。我想在我的应用程序中也有这种效果。
实施此方法的最佳方式是什么?
由于
答案 0 :(得分:15)
实现这一目标的唯一方法是iOS 5。 在iOS 5中,UIWebView具有UIScrollView子视图。
并使用以下代码:
设置地址栏的区域:
[[myWebView scrollView] setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
使用scrollview委托移动地址栏:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if(scrollView.contentOffset.y>=-64&&scrollView.contentOffset.y<30)
{
topBar.frame=CGRectMake(0,-44-scrollView.contentOffset.y, 320, 44);
}
else if(scrollView.contentOffset.y<-64)
topBar.frame=CGRectMake(0,20, 320, 44);//Lock the position
}
答案 1 :(得分:4)
有一种方法,但我不确定它是否有点过于hacky。首先在webview中搜索scrollview,然后更改contentInset,最后将搜索栏(例如)添加到scrollview。以下代码只是一个示例,我没有正确设置任何框架,40只是搜索栏的组合高度。我不确定这是否适用于每个iOS版本。
UIWebView * myWebView = [[UIWebView alloc] init]
UISearchBar * mySearchBar = [[UISearchBar alloc] init];
for (NSObject * aSubView in [myWebView subviews]) {
if ([aSubView isKindOfClass:[UIScrollView class]]) {
UIScrollView * theScrollView = (UIScrollView *)aSubView;
theScrollView.contentInset = UIEdgeInsetsMake(40, 0, 0, 0);
[theScrollView addSubview:mySearchBar];
}
}
答案 2 :(得分:0)
想想看,它只是一个滚动的视图,顶部有一个地址栏,网页视图和条形图总是一起移动。现在,假设您创建一个滚动视图并添加两个子视图,地址栏和Web视图(一个在另一个下面)。需要注意的是,在加载页面后(webViewDidFinishLoad:
)确定并修复了Web视图的高度。
因此,它只是一个滚动视图,其contentSize等于条形的高度+ Web视图的高度。现在,默认情况下,Web视图允许滚动,因为它具有滚动视图作为子视图。由于只有外部滚动视图应滚动,因此需要关闭Web视图的滚动。为此,获取第一个子视图(即滚动视图)并使用以下命令禁用其滚动:
(UIScrollView*)[myWebView.subviews objectAtIndex:0].scrollEnabled = NO;
答案 3 :(得分:0)
PeakJi的解决方案有效,但有点滞后。更好的解决方案是在UIScrollView的内容偏移量中添加一个观察者,如
[scrollview addObserver:self forKeyPath:@"contentOffset"
options:NSKeyValueObservingOptionNew context:nil];
您可以在
找到有关NSKeyValueObserving协议的更多文档