Saya memiliki konten UIWebView
dengan (satu halaman) berbeda. Saya ingin mencari tahu CGSize
konten untuk mengubah ukuran tampilan orang tua saya dengan tepat. -sizeThatFits:
Sayangnya yang jelas hanya mengembalikan ukuran bingkai webView saat ini.
116
Jawaban:
Ternyata tebakan pertama saya menggunakan
-sizeThatFits:
tidak sepenuhnya salah. Tampaknya berfungsi, tetapi hanya jika bingkai webView disetel ke ukuran minimal sebelum dikirim-sizeThatFits:
. Setelah itu kita bisa mengoreksi ukuran frame yang salah dengan ukuran yang pas. Ini terdengar buruk tapi sebenarnya tidak seburuk itu. Karena kami melakukan kedua perubahan bingkai tepat setelah satu sama lain, tampilan tidak diperbarui dan tidak berkedip.Tentu saja, kami harus menunggu hingga konten dimuat, jadi kami memasukkan kode ke dalam
-webViewDidFinishLoad:
metode delegasi.Obj-C
Cepat 4.x
Saya harus menunjukkan bahwa ada pendekatan lain (terima kasih @GregInYEG) menggunakan JavaScript. Tidak yakin solusi mana yang berkinerja lebih baik.
Dari dua solusi hacky, saya lebih suka yang ini.
sumber
UIWebView
tampilan Anda lebih tinggi dari tampilan orang tua, Anda perlu menyematkannya ke fileUIScrollView
.Saya memiliki solusi lain yang berfungsi dengan baik.
Di satu sisi, pendekatan & solusi Ortwin hanya berfungsi dengan iOS 6.0 dan yang lebih baru, tetapi gagal berfungsi dengan benar di iOS 5.0, 5.1 dan 5.1.1, dan di sisi lain ada sesuatu yang saya tidak suka dan tidak dapat mengerti. dengan pendekatan Ortwin, itu adalah penggunaan metode
[webView sizeThatFits:CGSizeZero]
dengan parameterCGSizeZero
: Jika Anda membaca dokumentasi Resmi Apple tentang metode ini dan parameternya, dikatakan dengan jelas:Yang saya maksud adalah sepertinya dia menemukan solusinya tanpa logika apa pun, karena membaca dokumentasi, parameter yang diteruskan
[webView sizeThatFits: ...]
setidaknya harus memiliki yang diinginkanwidth
. Dengan solusinya, lebar yang diinginkan diatur kewebView
bingkai sebelum memanggilsizeThatFits
denganCGSizeZero
parameter. Jadi saya mempertahankan solusi ini berfungsi di iOS 6 secara "kebetulan".Saya membayangkan pendekatan yang lebih rasional, yang memiliki keuntungan bekerja untuk iOS 5.0 dan yang lebih baru ... Dan juga dalam situasi kompleks di mana lebih dari satu webView (Dengan propertinya
webView.scrollView.scrollEnabled = NO
tertanam dalam filescrollView
.Berikut adalah kode saya untuk memaksa Layout
webView
ke yang diinginkanwidth
dan mendapatkanheight
set yang sesuai kembali kewebView
dirinya sendiri:Obj-C
Cepat 4.x
Perhatikan bahwa dalam contoh saya,
webView
itu tertanam dalam kebiasaan yangscrollView
memilikiwebViews
... Semua iniwebViews
memiliki merekawebView.scrollView.scrollEnabled = NO
, dan bagian terakhir dari kode yang harus saya tambahkan adalah perhitungan dariheight
dari embeddingcontentSize
khusus sayascrollView
iniwebViews
, tetapi itu semudah sebagai menjumlahkan sayawebView
'sframe.size.height
dihitung dengan trik yang dijelaskan di atas ...sumber
-[UIWebView scrollView]
hanya tersedia di iOS 5.0 atau lebih baru.Menghidupkan kembali pertanyaan ini karena saya menemukan jawaban Ortwin hanya berfungsi SEBAGIAN besar waktu ...
The
webViewDidFinishLoad
Metode dapat disebut lebih dari sekali, dan nilai pertama dikembalikan olehsizeThatFits
hanya beberapa bagian dari apa ukuran akhir harus. Lalu untuk alasan apa pun panggilan berikutnya kesizeThatFits
saatwebViewDidFinishLoad
diaktifkan lagi akan salah mengembalikan nilai yang sama seperti sebelumnya! Ini akan terjadi secara acak untuk konten yang sama seolah-olah itu semacam masalah konkurensi. Mungkin perilaku ini telah berubah dari waktu ke waktu, karena saya sedang membangun untuk iOS 5 dan juga menemukan bahwasizeToFit
bekerja dengan cara yang hampir sama (meskipun sebelumnya tidak?)Saya telah menetapkan solusi sederhana ini:
Swift (2.2):
Pembaruan: Saya telah menemukan seperti yang disebutkan di komentar ini tampaknya tidak menangkap kasus di mana konten telah menyusut. Tidak yakin apakah itu benar untuk semua konten dan versi OS, cobalah.
sumber
webView.scalesPageToFit = YES
seperti yang disebutkan @Sijo dalam komentar di atas.Di Xcode 8 dan iOS 10 untuk menentukan ketinggian tampilan web. Anda bisa mendapatkan ketinggian menggunakan
ATAU untuk Swift
sumber
Solusi sederhana adalah dengan hanya menggunakan
webView.scrollView.contentSize
tetapi saya tidak tahu apakah ini berfungsi dengan JavaScript. Jika tidak ada JavaScript yang digunakan, ini pasti berfungsi:sumber
AFAIK dapat Anda gunakan
[webView sizeThatFits:CGSizeZero]
untuk mengetahui ukuran isinya.sumber
Aneh!
Saya diuji solusi baik
sizeThatFits:
dan[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"]
yang tidak bekerja untuk saya.Namun, saya menemukan cara mudah yang menarik untuk mendapatkan ketinggian yang tepat dari konten halaman web. Saat ini, saya menggunakannya dalam metode delegasi saya
scrollViewDidScroll:
.Diverifikasi di iOS 9.3 Simulator / Perangkat, semoga berhasil!
EDIT:
Latar belakang: Konten html dihitung oleh variabel string saya dan template konten HTTP, dimuat dengan metode
loadHTMLString:baseURL:
, tidak ada skrip JS terdaftar di sana.sumber
Untuk iOS10, saya mendapatkan nilai 0 (nol)
document.height
begitudocument.body.scrollHeight
juga solusi untuk mendapatkan tinggi dokumen di Webview. Masalahnya bisa diatasi juga untukwidth
.sumber
Saya menggunakan
UIWebView
yang bukan subview (dan karenanya bukan bagian dari hierarki jendela) untuk menentukan ukuran konten HTMLUITableViewCells
. Saya menemukan bahwa terputusUIWebView
tidak melaporkan ukurannya dengan benar-[UIWebView sizeThatFits:]
. Selain itu, seperti yang disebutkan di https://stackoverflow.com/a/3937599/9636 , Anda harus menyetelUIWebView
sframe
height
ke 1 untuk mendapatkan ketinggian yang tepat.Jika
UIWebView
tinggi badan terlalu besar (misalnya, Anda menyetelnya ke 1000, tetapi ukuran konten HTML hanya 500):Semua mengembalikan
height
1000.Untuk mengatasi masalah saya dalam kasus ini, saya menggunakan https://stackoverflow.com/a/11770883/9636 , yang saya pilih dengan patuh. Namun, saya hanya menggunakan solusi ini jika saya
UIWebView.frame.width
sama dengan-[UIWebView sizeThatFits:]
width
.sumber
Tidak ada saran di sini yang membantu saya dengan situasi saya, tetapi saya membaca sesuatu yang memang memberi saya jawaban. Saya memiliki ViewController dengan satu set kontrol UI tetap diikuti oleh UIWebView. Saya ingin seluruh halaman menggulir seolah-olah kontrol UI terhubung ke konten HTML, jadi saya menonaktifkan pengguliran di UIWebView dan kemudian harus mengatur ukuran konten tampilan gulir induk dengan benar.
Tip pentingnya adalah UIWebView tidak melaporkan ukurannya dengan benar hingga ditampilkan ke layar. Jadi ketika saya memuat konten, saya mengatur ukuran konten ke ketinggian layar yang tersedia. Kemudian, di viewDidAppear saya memperbarui ukuran konten scrollview ke nilai yang benar. Ini berhasil untuk saya karena saya memanggil loadHTMLString pada konten lokal. Jika Anda menggunakan loadRequest, Anda mungkin perlu memperbarui contentSize di webViewDidFinishLoad juga, bergantung pada seberapa cepat html diambil.
Tidak ada kedipan, karena hanya bagian tak terlihat dari tampilan gulir yang diubah.
sumber
webViewDidFinishLoad
sebagai pendekatan yang aman.Jika HTML Anda berisi konten HTML yang berat seperti iframe (yaitu facebook-, twitter, instagram-embeds), solusi sebenarnya jauh lebih sulit, pertama-tama bungkus HTML Anda:
Kemudian tambahkan penanganan x-update-webview-height -scheme ke dalam shouldStartLoadWithRequest :
Dan terakhir tambahkan kode berikut di dalam layout Anda :
PS Anda dapat mengimplementasikan penundaan waktu (SetTimeout dan setInterval) di dalam ObjectiveC / Swift-code Anda - terserah Anda.
PSS Info penting tentang UIWebView dan Facebook Embeds: Posting Facebook yang disematkan tidak ditampilkan dengan benar di UIWebView
sumber
Saat menggunakan tampilan web sebagai subview di suatu tempat di scrollview, Anda dapat mengatur batasan ketinggian ke beberapa nilai konstan dan kemudian membuat outlet darinya dan menggunakannya seperti:
sumber
Saya juga terjebak pada masalah ini, kemudian saya menyadari bahwa jika saya ingin menghitung tinggi dinamis dari webView, saya perlu memberi tahu lebar webView terlebih dahulu, jadi saya menambahkan satu baris sebelum js dan ternyata saya bisa mendapatkan tinggi sebenarnya sangat akurat.
Kodenya sederhana seperti ini:
sumber
Xcode8 swift3.1:
webViewDidFinishLoad
Delegasi:let height = webView.scrollView.contentSize.height
Tanpa langkah1, jika webview.height> actual contentHeight, langkah 2 akan mengembalikan webview.height tetapi tidak contentsize.height.
sumber
Juga di iOS 7 untuk bekerja dengan benar dari semua metode yang disebutkan, tambahkan ini dalam
viewDidLoad
metode pengontrol tampilan Anda :Jika tidak, tidak ada metode yang akan berfungsi sebagaimana mestinya.
sumber