objective-c - 类似于 Mobile Safari 的可滚动 UINavigationBar

标签 objective-c uiwebview uinavigationcontroller uinavigationbar mobile-safari

我的应用程序使用 UINavigationController,最终 View (详细 View )允许您使用 UIWebView 在应用程序中查看外部网站。

我想在用户查看网页时释放一些额外的屏幕空间,并想模拟 iPhone 上的 Safari 的工作方式,当您查看内容时,他们顶部的 URL 栏会向上滚动并离开屏幕在折叠下方的 UIWebView 中。

有人知道如何实现这一点吗?如果我设置 navigationBarHidden 属性并在顶部滚动我自己的自定义栏,并在 UIScrollView 中设置它和 UIWebView 那么就会出现滚动问题在 UIWebView 中,因为它不能很好地与其他可 ScrollView 一起播放。

最佳答案

根据@Brian 的建议,我编写了以下代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat height = navigationBar.frame.size.height;
    CGFloat y = scrollView.bounds.origin.y;
    if (y <= 0) {
        CGRect frame = navigationBar.frame;
        frame.origin.y = 0;
        navigationBar.frame = frame;
    } else if (tableView.contentSize.height > tableView.frame.size.height) {
        CGFloat diff = height - y;
        CGRect frame = navigationBar.frame;
        frame.origin.y = -y;
        navigationBar.frame = frame;

        CGFloat origin = 0;
        CGFloat h = height; // height of the tableHeaderView
        if (diff > 0) {
            origin = diff;
            h = y;
        }
        frame = tableView.frame;
        frame.origin.y = origin;
        frame.size.height = tableView.superview.frame.size.height - origin;
        tableView.frame = frame;

        CGRect f = CGRectMake(0, 0, tableView.frame.size.width, h);
        UILabel* label = [[UILabel alloc] initWithFrame:f];
        tableView.tableHeaderView = label;
        [label release];
    }
}

我的代码有一个 UITableView 但应该可以与任何可滚动组件一起使用。如果除了 navigationBar 和 UIScrollView 子类之外还有其他组件,您应该更改计算可滚动组件高度的方式。像这样:

frame.size.height = tableView.superview.frame.size.height - origin - otherComponentsHeight;

我需要添加一个愚蠢的 tableHeaderView 以获得所需的行为。问题是当调用 scrollViewDidScroll: 时,内容有一个偏移量,但 Mobile Safari 中的外观是内容不会滚动,直到 navigationBar 完全消失。我首先尝试将 contentOffset.y 更改为 0,但显然它不起作用,因为所有代码都依赖于滚动机制。所以我只是添加了一个 tableHeaderView,它的高度恰好是滚动的偏移量,因此从未真正看到标题,并且内容似乎不会滚动,直到 navigationBar 完全消失。

如果您不添加哑 tableHeaderView,则可滚动组件似乎在 navigationBar 后面滚动。

enter image description here

对于 tableHeaderView,可滚动组件实际上是滚动的(如 scrollbar 所示),但是因为有一个 tableHeaderView,它的高度与滚动的 offset 完全相同,可滚动的内容在 navigationBar 完全消失之前似乎没有滚动:

enter image description here

关于objective-c - 类似于 Mobile Safari 的可滚动 UINavigationBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263180/

相关文章:

iOS创建滑动返回

objective-c - 带有 NavigationController 和 TabController 的 Storyboard

objective-c - 如何通过popoverview Controller 显示imagepickercontroller?

iphone - 目标副本评估

objective-c - 当用户点击下拉列表 HTML 选择标签时,ios8 iPad uiwebview 在显示弹出窗口时崩溃

ios - UINavigationController:在 iPad 上呈现 View Controller ,同时关闭另一个 Controller

iOS:UICollectionView 上的单独部分背景颜色

ios - UIWebView 的内容背景颜色不透明

ios - 在 ios9 上的 uiwebview 中显示 pdf 有时滚动会卡住

swift - 带有两个 UIBarButtons 的 NavigationBar 标题