2013-10-22 38 views
6

Bazı etiketler içeren bir görüntüleme denetleyicim ve içinde bir miktar html yükleyen bir UIWebView var. Tüm bu etiketler ve UIWebView, bir UIScrollView'ın alt görünümleridir. UIWebView'ın kaydırılmasını devre dışı bıraktım, böylece UIWebView etiketleri ve UIWebView, UIScrollView içinde bir arada kaydırılır.UIWebView Tamamen Yüklenmiyor, Yükseklik Değişir

Daha sonra UiWebView içindeki içeriğin boyutunu buldum, içerik boyutuna göre UIWebView boyutunu değiştirdim ve ardından kaydırma görünümünün boyutunu web görünümünün boyutuna ayarlayın. Bu şimdiye webViewDidFinishLoad aşağıdaki kodu ekleyerek yaptım nasıl i Web görünümündeki içeriği boyutunu görmek için NSLog kullanıyorum gibi, ben aynı içerik farklı yüksekliği sağlar fark

CGRect frame = myWebView.frame; 
frame.size.height = 1; 
myWebView.frame = frame; 
CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; 
frame.size = fittingSize; 
myWebView.frame = frame; 

NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); 

mainScrollView.contentSize = myWebView.bounds.size; 

. Örneğin, görüntü denetleyicisini ilk kez açıyorsam, 915.0'a eşitliği gösterir ve navigasyonda geri gidip bu görüntü denetleyicisine geri döndüğümde, günlük boyutu 1012.0 olarak gösterecektir.

Bunun html içeriğindeki görüntülerin yüklenmesinden kaynaklanmış olabileceğine inanıyorum. İlk kez doğru yüksekliği göstermek için onu nasıl düzeltebileceğimi bilen var mı? Teşekkürler!

GÜNCELLEME: i Aşağıdaki kodu kullanarak zaten denemiş olduğu, javascript kullanarak farklı bir strateji kullanıyorsanız: i tam olarak hangi

CGRect oldBounds = [[self myWebView] bounds]; 
CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; 
NSLog(@"NEW HEIGHT %f", height); 
[myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; 
mainScrollView.contentSize = myWebView.bounds.size; 

Bu kod günlüğüne her zaman bana doğru yüksekliği sağlar İstediğiniz ancak tüm web görünümü, üstündeki tüm etiketleri engelleyerek yukarı doğru kaydırılır. Yanlış bir şey yapıyorum ve nasıl düzelteceğim? Teşekkürler!

+0

Kaydırma görünümünü de mi kaydediyorsunuz? Bu ilginç bir sonuç gösterebilir. Herhangi bir xib uyarı mesajı? –

+0

ve bu soru yardımcı olabilir: http://stackoverflow.com/questions/6440448/ios-uiwebview-inside-a-uiscrollview?rq=1 veya bu: http://stackoverflow.com/questions/8089992/content-change -with-uiwebview-load-inside-scrollview? rq = 1 –

+0

@DavidDelMonte kullanıyorum NSString * webHeight = [myWebView stringByEvaluatingJavaScriptFromString: @ "document.height;"]; NSLog (@ "WebView Height% @", webHeight); sonra her zaman tam yüksekliği gösterir ama burada webHeight bir NSString, webWeight'ın yüksekliğine myWebView'ın yüksekliğini nasıl ayarlayabilirim? – AJ112

cevap

10

UIWebView ve Diğer görünümleri bir UIScrollView içine gömmeye çalıştığınızda bu çok yaygın bir sorundur.

ÇÖZÜM 1: Sorunuzdaki ilk çözümü zaten açıkladınız. Bu çözüm, yalnızca UISWrollView içindeki UIWebView'de yalnızca metin olduğunda geçerlidir. Resimler ve ajax ya da tembel olarak yüklenen herhangi bir şey varsa, bu çözüm size ilk defa doğru yüksekliği vermez.

CGRect frame = myWebView.frame; 
frame.size.height = 1; 
myWebView.frame = frame; 
CGSize fittingSize = [myWebView sizeThatFits:CGSizeZero]; 
frame.size = fittingSize; 
myWebView.frame = frame; 

NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height); 

mainScrollView.contentSize = myWebView.bounds.size; 

ÇÖZÜM 2: Diğer bir çözüm JavaScript kullanan. Size her zaman doğru yüksekliği verir, ancak sorun gideremediğim tuhaf sorunlarla karşılaşırsınız. Durumunuzda, tüm görüşün biraz yukarı doğru kaydığını söylediniz.

CGRect oldBounds = [[self myWebView] bounds]; 
CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; 
NSLog(@"NEW HEIGHT %f", height); 
[myWebView setBounds:CGRectMake(oldBounds.origin.x, oldBounds.origin.y, oldBounds.size.width, height)]; 
mainScrollView.contentSize = myWebView.bounds.size; 

ÇÖZÜM 3: son çözüm benim için çalıştı biridir ve kesinlikle sorununuzu çözecektir. Tanımladığım ilk iki çözümde kodu birleştirmeyi içerir. Bu, her seferinde doğru yüksekliği verdiği için javascript kullanarak yüksekliği alacak ve kodun geri kalanını ilk çözümde kullanacak ve birkaç puan artıracaktır. i +125.0 eklendi edin, bu bunu nasıl çözdüğünü geçerli:

CGFloat height = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.height"] floatValue]; 
CGFloat width = [[myWebView stringByEvaluatingJavaScriptFromString:@"document.width"] floatValue]; 
CGRect frame = myWebView.frame; 
frame.size.height = height + 125.0; 
frame.size.width = width; 
myWebView.frame = frame; 
mainScrollView.contentSize = myWebView.bounds.size; 

Umut bu yardımcı olur!

+0

bir çekicilik gibi çalıştı! – AJ112

+1

üçüncü çözüm çalışıyor, ancak HTML dizesi görüntü kaynakları içeriyorsa değil. – bluenowhere

1

WebView, tüm içeriğini eşzamansız olarak yükler.

webViewDidFinishLoading için beklemeniz gerekir, böylece html yüklenir (henüz resim verisi değil!) Ardından, html'nin boyutunu bilir. Orada sizeToFit çalışması gerekir.

+0

, bu sayede genişlik = XY ve yükseklik = XY özniteliklerine sahip olan imgelerin (ve harici kaynaklara atıfta bulunan diğer etiketlerin) olduğunu varsayar! –

+0

Cevabınızda bazı kodları sağlayabilir ve sizeToFit nasıl kullanılır ?? – AJ112

+0

@ AJ112 [UIView'] belgelerine bakın (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instm/ UIView/sizeToFit). Eğer UIWebView * webView' varsa, '[webView sizeToFit]' diyebilirsiniz. –

1

UIWebView arka planda yüklendiğinden, sayfanızı yükleyip sonra yüksekliği belirleyene kadar beklemeniz gerekir.

Tek yöntem şu şekildedir: https://stackoverflow.com/a/3937599/210171. Bununla birlikte, genellikle javascript tekniğini kullanıyorum. Web görünümü temsilci olarak, bu gibi görünecek şekilde -webViewDidFinishLoad: değiştirin: görüntüleri yük olarak

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    NSString * heightString = [webview stringByEvaluatingJavaScriptFromString:@"document.getElementById(\"foo\").offsetHeight;"]; 
    CGFloat contentHeight = [ heightString doubleValue ] ; 
    NSLog(@"contentHeight=%f\n", contentHeight) ; 
} 

(Bu kod https://stackoverflow.com/a/751326/210171 alınır) içeriğin yüksekliği değişmeye devam edebilir

eğer görüntüleri don' beden nitelikleri ayarlanmış. Bu durumda lütfen cevabımı buraya bakın: https://stackoverflow.com/a/12030878/210171

+0

'u farklı bir javascript benim için çalıştı ancak beklemeden bir sorun olarak bekleyin, sorunun içindeki güncellemeye bakın. Teşekkürler! Yüksekliği aldıktan sonra yanlış bir şey yapıyorum olabilir. Güncelleme sayfamıza bakın – AJ112

+0

Ekteki kaydırma görünümünüzün konumlandığından emin misiniz? ScrollView.backgroundColor = [UIColor redColor] 'ayarlamayı deneyin ya da bunun gibi bir şey konumlandırıldığını görebilirsiniz. Web görünümünüz için de aynısını yapın: 'webView.backgroundColor = [UIColor orangeColor]' ... – nielsbot