Как встроить WebView в NSScrollView?

Итак, у меня есть проект, в котором некоторый контент отображается в WebView, и я хочу придерживаться этого. Я хочу, чтобы заголовок прокручивался с содержимым WebView. Теперь WebView обычно хочет выполнять свою собственную обработку прокрутки, но вы можете запретить ей использовать:

[[webView mainFrame] setAllowsScrolling:NO];

что успешно заставляет полосы прокрутки WebView не отображаться. Однако, несмотря на то, что он встроен в NSScrollView, полосы прокрутки NSScrollView никогда не активируются. Я могу только заключить, что WebView нужно изменить размер, но я не могу понять, как это сделать. Я пробовал следующее:

NSRect webViewBounds = [webView bounds];
[webView setFrameSize:webViewBounds.size];

но это тоже не работает.

Какие-либо предложения?


person Benno    schedule 13.10.2009    source источник


Ответы (3)


Альтернативное решение: как насчет выражения заголовка в HTML/CSS/JavaScript и размещения реального контента в iframe? Вы можете просмотреть иерархию фреймов, чтобы найти объект WebFrame для этого фрейма, и использовать DOM (возможно, обернутый вашим собственным объектом) для управления заголовком.

person Peter Hosey    schedule 14.10.2009
comment
Да, я думал попробовать это. Похоже на кладж, но если это то, что нужно... =) - person Benno; 14.10.2009

Я быстро просмотрел документы для этого, возможно, глупый вопрос; после изменения размера кадра вы отправляете сообщение setNeedsDisplay в представление?

person Abizern    schedule 13.10.2009
comment
Да, я. Нет разницы. Я подозреваю, что проблема может заключаться в том, что размер WebView зависит от размера, который я дал ему в Interface Builder. Я не уверен, как сказать ему, что он может быть настолько большим, насколько он хочет, и как узнать, насколько большим он может быть с учетом содержимого. Я мог бы просто попробовать дать ему огромный вертикальный размер и посмотреть, как это пойдет. - person Benno; 14.10.2009

Границы и рамка в вашем коде должны иметь одинаковый размер. Установка одного на другое ничего не меняет.

Сегодня я немного поигрался с классом WebView. С моим подходом вам не нужно было бы добавлять свой заголовок в HTML-код. Регистрация для получения уведомлений дает вам отправную точку:

  [[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(webViewDidScroll:)
    name:NSViewBoundsDidChangeNotification object:nil];

Затем вы можете проверить класс отправителя уведомления (допустим, у вас есть только один WebView):

- (void)webViewDidScroll:(NSNotification *)aNotification
{
  if ([[aNotification object] isKindOfClass:NSClassFromString(@"WebClipView")])
  {
    // Do whatever you like; scroll your header etc.
  }
}
person Rafael Bugajewski    schedule 16.04.2011