Прокручиваемая UINavigationBar похожа на мобильное сафари - PullRequest
3 голосов
/ 12 августа 2009

Мое приложение использует UINavigationController, а окончательный вид (подробный вид) позволяет просматривать внешний веб-сайт в приложении с помощью UIWebView.

Я хотел бы высвободить некоторые дополнительные возможности экрана, когда пользователь просматривает веб-страницу и хочет эмулировать работу Safari на iPhone, когда его полоса URL вверху и вверх прокручивается при просмотре контента. в UIWebView это ниже сгиба.

У кого-нибудь есть идеи, как этого добиться? Если я установлю свойство navigationBarHidden и поверну свою собственную пользовательскую панель вверху и установлю ее и значение UIWebView в пределах UIScrollView, то в UIWebView возникнут проблемы с прокруткой, так как он плохо сочетается с другими прокручиваемыми вид.

Ответы [ 3 ]

4 голосов
/ 20 марта 2012

Основываясь на предложении @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, но должен работать с любым прокручиваемым компонентом. Если у вас есть другие компоненты, кроме навигационной панели и подкласса UIScrollView, вам следует изменить способ вычисления высоты прокручиваемого компонента. Как то так:

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

Мне нужно было добавить немой tableHeaderView, чтобы иметь желаемое поведение. Проблема заключалась в том, что при вызове scrollViewDidScroll: содержимое имеет смещение, но, по-видимому, в Mobile Safari содержимое не прокручивается до полного исчезновения навигационной панели. Сначала я попытался изменить contentOffset .y на 0, но, очевидно, это не сработало, поскольку весь код использует механизм прокрутки. Поэтому я просто добавил tableHeaderView, высота которого точно равна смещению прокрутки, поэтому заголовок действительно никогда не виден, и содержимое, по-видимому, не прокручивается, пока navigationBar полностью не исчезнет.

Если вы не добавите немой т ableHeaderView, то прокручиваемый компонент появится для прокрутки за navigationBar.

enter image description here

С tableHeaderView прокручиваемый компонент фактически прокручивается (как видно из scrollbar), но, поскольку есть tableHeaderView, высота которого точно равна прокручиваемой offset, прокручиваемое содержимое появляется не прокручивать, пока navigationBar полностью не исчезнет:

enter image description here

1 голос
/ 20 ноября 2009

У делегата для событий прокрутки в UIWebView, и когда вы изначально начинаете прокручивать UIWebView, увеличьте высоту UIWebView и одновременно уменьшите его позицию Y, одновременно перемещая панель навигации вверх в направлении Y. После того, как навигационная панель полностью сместится из поля зрения, прекратите увеличивать размер UIWebView и просто разрешите нормальную прокрутку.

Это создаст иллюзию того, что навигационная панель является частью UIWebView при ее прокрутке с экрана.

Кроме того, вам нужно сделать обратное, когда вы прокручиваете в противоположном направлении и достигаете вершины содержимого UIWebView.

0 голосов
/ 19 ноября 2009

Не могу дать вам прямой ответ, но взгляните на iWebKit. Может быть, это обеспечивает решение. Демонстрация, по крайней мере, содержит элемент «полный экран».

...