2012-01-20 3 views
10

Я разместил несколько UIWebView s бок о бок в UIScrollView. Каждый UIWebView включает в себя представление «веб-браузер», в котором отображается локальный HTML-файл. К сожалению, я не знаю, как загрузить веб-просмотры в фоновом режиме и в то же время предотвратить или остановить выполнение функций JavaScript, включенных в файлы HTML. Я имею в виду «на заднем плане», поскольку я смотрю первые несколько панелей, а пока остальные панели просто ленивы загружаются молча. Я видел разные приложения (например, pugpig) - это ленивы загружает страницы HTML и останавливает анимацию JavaScript - он может каким-то образом остановить JavaScript, чтобы оживить весь эффект затухания, который я часто использую на своих HTML-страницах между переключателями табуляции и на данный момент Я загружаю панель, которая продолжает анимацию затухания.Пауза выполнения JavaScript в UIWebView

Итак, вопрос:

Как приостановить анимацию JavaScript и предотвратить проблемы с памятью с помощью кода Objective-C и как я могу продолжить выцветание анимации, когда я отобразить панель?

ответ

4

Вы пробовали инъекционные JavaScript (т.е. - (NSString*) stringByEvaluatingJavaScriptFromString: (NSString *)script), который наблюдает onblur и onfocus в window или pageshow и pagehide? This post предлагает несколько решений для этого.

Таким образом, вы можете попробовать что-то вроде

$(window).blur(function(){ 
    // when the web view loses focus 
}); 
$(window).focus(function(){ 
    // when the web view gains focus 
}); 

Если это не удается, можно попробовать pagehide и pageshow события:

function pageShown(evt) 
{ 
    if (evt.persisted) 
     // The page was just restored from the Page Cache 
    else 
     // The initial load. This is the same as the page load event 
} 

function pageHidden(evt) 
{ 
    if (evt.persisted) 
     // The page was suspended and placed into the Page Cache 
    else 
     // This is the same as the page unload event 
} 

window.addEventListener("pageshow", pageShown, false); 
window.addEventListener("pagehide", pageHidden, false); 
0

Может быть, вы можете попробовать оценить (с помощью stringByEvaluatingJavaScriptFromString) нарочито-неисправна фрагмент кода javascript и заставить js-интерпретатор задохнуться?

<script> var j =  // note: missing value, error! 
</script> 
1

Я думаю, вы можете управлять анимационными javascripts, которые запускаются в HTML (вы сказали, что страница является локальной). Что бы я сделал, это обернуть анимацию в функции JS, которая будет вызвана из Cocoa (для StackOverFlow есть тэги ссылок, например - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script).

Тогда я бы создал стек, у которого есть запись для каждой из HTML-страниц, которые вы хотите ленивой загрузки. На каждом UIScrollView scrollViewDidScroll: я бы проверял, выполнил ли прокрутка в размере всего размера веб-просмотра, если бы я поместил эту запись из стека и вызвал функцию JAJAIR для запуска Javascript, о которой мы упоминали ранее в следующем веб-просмотре.

Если вам нужна двусторонняя связь (от javascript к какао), например, чтобы указать, что анимация завершена, вы можете использовать JSBridge. (How do I call an Objective-C method from JavaScript on UIWebView?)

Смежные вопросы