2013-06-23 18 views
5

UIWebView'ın kendisini yeniden çizmesine neden olacak teknikler var mı? UIWebView ve UIScrollView üzerinde setNeedsDisplay ve setNeedsLayout denedim, ancak çalıştı.UIWebView'ı yeniden çizmek için zorlanıyor musunuz?

+0

İşi yeniden yükleyebilir miyim? – Raptor

+0

@ShivanRaptor Bu, ancak tüm sayfanın yeniden yüklenmesini gerektirecektir; bu, zaten var olanı basit yeniden çizme/yeniden gösterme ile karşılaştırıldığında * çok uzun * alacaktır. Ancak çözümü buldum. – mattsven

+0

'HTML' içeriğindeki' javascript' nedir? veya "HTML" başlığındaki "meta" etiketi mi? – holex

cevap

9

Soruyu tam olarak cevapladıktan sonra doğru buldum. Anahtar, kendilerini yeniden çizmek için UIWebView'un scrollView'un alt görünümlerini, özellikle de UIWebBrowserView'u anlatmaktı.

- (void) forceRedrawInWebView:(UIWebView*)webView { 
    NSArray *views = webView.scrollView.subviews; 

    for(int i = 0; i<views.count; i++){ 
     UIView *view = views[i]; 

     //if([NSStringFromClass([view class]) isEqualToString:@"UIWebBrowserView"]){ 
      [view setNeedsDisplayInRect:webView.bounds]; // Webkit Repaint, usually fast 
      [view setNeedsLayout]; // Webkit Relayout (slower than repaint) 

      // Causes redraw & relayout of *entire* UIWebView, onscreen and off, usually intensive 
      [view setNeedsDisplay]; 
      [view setNeedsLayout]; 
      // break; // glass in case of if statement (thanks Jake) 
     //} 
    } 
} 

Ben UIWebBrowserView 'ın sınıf adı değişmiyor üzerinde beyanı güvenli olması ve önlemek için eğer bağımlılığımızı ortadan yorumladı ettik. Bu olmadan, bu bakışta gerçekten bir sorun olmayan (hiçbir önemli ek yükün oluşmadığı) ancak her zaman değişebilen, scrollview'deki tüm UIViews'lere rastlar.

DÜZENLEME: Bazı durumlarda

, JavaScript aşağıdaki pasajı aynı/benzer şeyi başarmak olacaktır:

window.scrollBy(1, 1); window.scrollBy(-1, -1); 

Sen UIScrollView 'ın contentOffset çok bunu düşünmek istiyorum, ama Bu benim deneyimimde her zaman böyle değil - bazı nedenlerden dolayı window.scrollTo bu konuda özeldir.

Gist: https://gist.github.com/matt-curtis/5843862

+0

Merhaba, cevabınız bana yardımcı oldu. Ancak, if ifadesini yorumlama şekliniz için for döngüsünün yalnızca ilk gösterimi yenilediğini lütfen unutmayın, çünkü break ifadesi hala yorumlanmamıştır. Web tarayıcısı görünümü genellikle ilk görünüm olduğu için çalıştığını düşünüyorum, ancak for döngüsü bu durumda hiçbir şey yapmadığından çözümünüzü biraz değiştirmek isteyebilirsiniz =) –

+1

@jake_hetfield Teşekkürler - Bunu kaçırdım! Ölçeklendirilebilirlik/etkinlik sonrası bir ders olarak sınıfları kontrol etmeme ve geride bırakılan 'kırma' mesajını kaçırmama meselesini ekledim. 'Onarın! Cevabınız size yardımcı oldu - bu sorunla uğraşırken bana da yardımcı oldu :) Ayrıca bu konu hakkında hatırlattığım başka bir şeyi de atmamı hatırlattı. – mattsven

+1

Bu benim hayatımı kurtar: self.wkWebView.evaluateJavaScript ("window.scrollBy (1, 1); window.scrollBy (-1, -1);", completionHandler: nil) –

0

Bu hayatımı kurtarmak:

self.wkWebView.evaluateJavaScript("window.scrollBy(1, 1);window.scrollBy(-1, -1);", completionHandler: nil) 

Web görünümündeki bu satırı ekleyin yük temsilci olay veya wkwebview bitiş navigasyonunu

sayesinde MAN

yaptılar yaptılar !!!!

İlgili konular