Apakah ada cara untuk membuat UIScrollView
penyesuaian otomatis dengan tinggi (atau lebar) dari konten yang sedang bergulir?
Sesuatu seperti:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Apakah ada cara untuk membuat UIScrollView
penyesuaian otomatis dengan tinggi (atau lebar) dari konten yang sedang bergulir?
Sesuatu seperti:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
Metode terbaik yang pernah saya temui untuk memperbarui ukuran konten UIScrollView
berdasarkan subview yang terkandung:
Objektif-C
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
Cepat
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
viewDidLayoutSubviews
sehingga autolayout akan selesai, di iOS7 itu bekerja dengan baik, tetapi menguji os iOS6 autolayout karena beberapa alasan tidak menyelesaikan pekerjaan, jadi saya memiliki beberapa nilai ketinggian yang salah, jadi saya beralih keviewDidAppear
sekarang berfungsi dengan baik .. hanya untuk menunjukkan mungkin seseorang akan membutuhkan ini. terima kasihUIScrollView tidak mengetahui ketinggian kontennya secara otomatis. Anda harus menghitung tinggi dan lebar untuk diri Anda sendiri
Lakukan dengan sesuatu seperti
Tapi ini hanya berfungsi jika pandangannya satu di bawah yang lain. Jika Anda memiliki tampilan di samping satu sama lain, Anda hanya perlu menambahkan ketinggian satu jika Anda tidak ingin mengatur konten scroller lebih besar dari yang sebenarnya.
sumber
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Solusi jika Anda menggunakan tata letak otomatis:
Setel
translatesAutoresizingMaskIntoConstraints
keNO
semua tampilan yang terlibat.Posisikan dan ukuran tampilan gulir Anda dengan kendala di luar tampilan gulir.
Gunakan batasan untuk meletakkan subview dalam tampilan gulir, pastikan kendala mengikat ke keempat tepi tampilan gulir dan jangan mengandalkan tampilan gulir untuk mendapatkan ukurannya.
Sumber: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
sumber
Saya menambahkan ini ke jawaban Espuz dan JCC. Ini menggunakan posisi y dari subview dan tidak termasuk bilah gulir. Edit Menggunakan bagian bawah sub tampilan terendah yang terlihat.
sumber
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
di awal danself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
di akhir metode?Inilah jawaban yang diterima dengan cepat untuk siapa saja yang terlalu malas untuk mengonversi itu :)
sumber
Inilah adaptasi Swift 3 dari jawaban @ leviatan:
PERPANJANGAN
PEMAKAIAN
Sangat mudah digunakan!
sumber
Mengikuti ekstensi akan sangat membantu di Swift .
Logikanya sama dengan jawaban yang diberikan. Namun, ini menghilangkan tampilan tersembunyi di dalam
UIScrollView
dan perhitungan dilakukan setelah indikator gulir ditetapkan tersembunyi.Selain itu, ada parameter fungsi opsional dan Anda dapat menambahkan nilai offset dengan meneruskan parameter ke fungsi.
sumber
Solusi hebat & terbaik dari @leviathan. Hanya menerjemahkan ke swift menggunakan pendekatan FP (pemrograman fungsional).
sumber
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Anda bisa mendapatkan tinggi konten di dalam UIScrollView dengan menghitung anak mana yang "mencapai lebih jauh". Untuk menghitung ini, Anda harus mempertimbangkan asal Y (mulai) dan tinggi barang.
Dengan melakukan hal-hal seperti ini, item (subview) tidak harus ditumpuk secara langsung di bawah yang lain.
sumber
Saya datang dengan solusi lain berdasarkan pada solusi @ emenegro
Pada dasarnya, kami mencari tahu elemen mana yang paling jauh dalam tampilan dan menambahkan padding 10px ke bawah
sumber
Karena scrollView dapat memiliki scrollViews lain atau pohon subViews inDepth yang berbeda, jalankan secara mendalam secara rekursif lebih disukai.
Cepat 2
Pemakaian
sumber
Atau lakukan saja:
(Solusi ini ditambahkan oleh saya sebagai komentar di halaman ini. Setelah mendapat 19 suara untuk komentar ini, saya memutuskan untuk menambahkan solusi ini sebagai jawaban resmi untuk kepentingan masyarakat!)
sumber
Untuk swift4 menggunakan kurangi:
sumber
Ukurannya tergantung pada konten yang dimuat di dalamnya, dan opsi kliping. Jika ini adalah tampilan teks, maka itu juga tergantung pada pembungkusnya, berapa banyak baris teks, ukuran font, dan seterusnya. Hampir tidak mungkin bagi Anda untuk menghitung sendiri. Berita baiknya adalah, ini dihitung setelah tampilan dimuat dan di viewWillAppear. Sebelum itu, semua tidak diketahui dan ukuran konten akan sama dengan ukuran bingkai. Namun, dalam metode viewWillAppear dan setelah (seperti viewDidAppear) ukuran konten akan menjadi aktual.
sumber
Membungkus kode Richy, saya membuat kelas UIScrollView khusus yang mengotomatisasi pengubahan ukuran konten sepenuhnya!
SBScrollView.h
SBScrollView.m:
Cara menggunakan:
Cukup impor file .h ke pengontrol tampilan Anda dan nyatakan instance SBScrollView alih-alih yang normal UIScrollView.
sumber
Tetapkan ukuran konten dinamis seperti ini.
sumber
itu benar-benar tergantung pada konten: content.frame.height mungkin memberi Anda apa yang Anda inginkan? Tergantung apakah konten adalah satu hal, atau kumpulan hal-hal.
sumber
Saya juga menemukan jawaban leviathan untuk bekerja yang terbaik. Namun, itu menghitung ketinggian yang aneh. Saat mengulangi subview, jika scrollview diatur untuk menampilkan indikator scroll, itu akan berada dalam array subview. Dalam hal ini, solusinya adalah untuk menonaktifkan sementara indikator gulir sebelum mengulang, kemudian membangun kembali pengaturan visibilitas sebelumnya.
-(void)adjustContentSizeToFit
adalah metode publik pada subkelas kustom UIScrollView.sumber
Saya pikir ini bisa menjadi cara yang rapi untuk memperbarui ukuran tampilan konten UIScrollView.
sumber
mengapa tidak satu baris kode ??
sumber
sumber