Начальная позиция прокрутки iOS7 в навигационной панели

У меня есть веб-просмотр, который прокручивается по желанию под панелью навигации.

Однако, когда я сначала загружаю контроллер, страница, загруженная в веб-просмотр, прокручивается так, что она выравнивается с верхней частью панели навигации. Когда я просматриваю веб-представление, правильная вставка присутствует сверху, чтобы сидеть правильно, это только неправильное исходное положение.

Как я могу получить начальную позицию для полной прокрутки вверху, включая вставку?

Ответы

Ответ 1

Если вы не против иметь непрозрачную панель навигации, самым простым решением может быть это в контроллере представления, который содержит ваш веб-просмотр:

self.navigationController.navigationBar.translucent = NO;

Позиционирование фрейма будет тогда принимать то же поведение, что и iOS6, волшебным образом!

Ответ 2

Ответ Рика правильный, за исключением того, что верхнее значение должно быть отрицательным, это то, что сработало для меня!

[self.webView.scrollView setContentInset:UIEdgeInsetsMake(-44, 0, 0, 0)];
[self.webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(-44, 0, 0, 0)];
[self.webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

Я использовал -44, если у вас нет строки состояния сверху, вы должны использовать -64.

Ответ 3

Как я решил эту проблему, с обратным вызовом делегата webViewDidFinishLoad. В методе обратного вызова для веб-представления, который я установил, сделайте всю работу, чтобы сделать вид прокрутки веб-представления правильным.

[webView.scrollView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)];
[webView.scrollView setScrollIndicatorInsets:UIEdgeInsetsMake(64, 0, 0, 0)];
[webView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

Ответ 4

У меня была такая же проблема и исправлена. Решение довольно просто:

Перейдите в раскадровку, выберите контроллер представления, содержащий ваш UIWebView, и откройте Инспектор атрибутов. Здесь вы увидите заголовок "Extend Edges", просто снимите флажок "Under Top Bars", и я буду работать!

Надеюсь, это поможет!

Ответ 5

используйте ниже

CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGFloat navHeight = self.navigationController.navigationBar.frame.size.height;
applicationFrame.origin.y = navHeight + 4;
webView = [[UIWebView alloc] initWithFrame:applicationFrame];

Ответ 6

Вы также можете установить смещение содержимого прокрутки webview в viewDidAppear:, например:

[self.webView.scrollView setContentOffset:CGPointMake(0, -64) animated:NO];

К сожалению, он не имеет никакого эффекта, если помещен в viewWillAppear:, поэтому, когда появится представление, вы увидите видимый прыжок в содержимом, когда он сдвинется из-под навигационной панели в новое место.

Ответ 7

Мое решение:

- (void)loadView {
    ...

    _offsetSet = NO;
}

- (void) viewDidLayoutSubviews {

    if (!_offsetSet) {
        [_webView.scrollView setContentOffset:CGPointMake(0, -self.topLayoutGuide.length) animated:NO];
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    _offsetSet = YES;
}

Ответ 8

Для более общей версии ответа @Puran, а не аппаратного 44 или 64, получите его из topLayoutGuide. Кроме того, если вы загружаете несколько раз, вам нужно только один раз изменить эти значения:

UIEdgeInsets insets = self.myWebView.scrollView.contentInset;
if ( UIEdgeInsetsEqualToEdgeInsets(insets, UIEdgeInsetsZero)) {
    insets.top = -self.topLayoutGuide.length;
    [self.myWebView.scrollView setContentInset:insets];
    [self.myWebView.scrollView setScrollIndicatorInsets:insets];
    [self.myWebView.scrollView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
}