Apakah ada cara yang baik untuk menyesuaikan ukuran UITextView
agar sesuai dengan kontennya? Katakan misalnya saya punya UITextView
yang berisi satu baris teks:
"Hello world"
Saya kemudian menambahkan baris teks lain:
"Goodbye world"
Apakah ada cara yang baik di Cocoa Touch untuk mendapatkan rect
yang akan menampung semua baris dalam tampilan teks sehingga saya bisa menyesuaikan tampilan induk sesuai?
Sebagai contoh lain, lihat bidang catatan untuk acara di aplikasi Kalender - perhatikan bagaimana sel (dan UITextView
berisi) memperluas untuk menahan semua baris teks dalam string catatan.
Jawaban:
Ini berfungsi untuk iOS 6.1 dan iOS 7:
Atau di Swift (Bekerja dengan Swift 4.1 di iOS 11)
Jika Anda ingin dukungan untuk iOS 6.1 maka Anda juga harus:
sumber
textview.scrollEnabled = NO;
untuk mencegah agar teks tidak terpotong bahkan di iOS 7.CGFLOAT_MAX
makro daripadaMAXFLOAT
. Tepat di kedua platform 32/64 bit.Ini tidak lagi berfungsi di iOS 7 atau lebih tinggi
Sebenarnya ada cara yang sangat mudah untuk melakukan pengubahan ukuran dari
UITextView
ketinggian konten yang benar. Ini dapat dilakukan dengan menggunakanUITextView
contentSize
.Satu hal yang perlu diperhatikan adalah bahwa yang benar
contentSize
hanya tersedia setelah ituUITextView
telah ditambahkan ke tampilan denganaddSubview
. Sebelum itu sama denganframe.size
Ini tidak akan berfungsi jika tata letak otomatis AKTIF. Dengan tata letak otomatis, pendekatan umum adalah menggunakan
sizeThatFits
metode dan memperbaruiconstant
nilai pada batasan ketinggian.heightConstraint
adalah kendala tata letak yang biasanya Anda siapkan melalui IBOutlet dengan menautkan properti ke batasan ketinggian yang dibuat dalam storyboard.Untuk menambah jawaban yang luar biasa ini, 2014, jika Anda:
ada perbedaan perilaku hanya dengan iPhone6 + :
Dengan 6+ saja (bukan 5s atau 6) itu memang menambahkan "satu lagi baris kosong" ke UITextView. "Solusi RL" memperbaiki ini dengan sempurna:
Ini memperbaiki masalah "garis ekstra" pada 6+.
sumber
layoutIfNeeded
. Maka Anda dapat mengambil ketinggian daricontentSize
.Untuk membuat ukuran secara dinamis
UITextView
di dalam aUITableViewCell
, saya menemukan kombinasi berikut berfungsi di Xcode 6 dengan iOS 8 SDK:UITextView
keUITableViewCell
dan batasi ke sampingUITextView
'sscrollEnabled
properti untukNO
. Dengan menggulir diaktifkan, bingkaiUITextView
bebas dari ukuran kontennya, tetapi dengan menggulir dinonaktifkan, ada hubungan antara keduanya.Jika tabel Anda menggunakan tinggi baris default asli 44 maka tabel akan secara otomatis menghitung ketinggian baris, tetapi jika Anda mengubah tinggi baris default ke yang lain, Anda mungkin perlu mengaktifkan penghitungan otomatis ketinggian baris secara manual di
viewDidLoad
:Untuk ukuran read-only secara dinamis
UITextView
, itu saja. Jika Anda mengizinkan pengguna untuk mengedit teks di AndaUITextView
, Anda juga perlu:Terapkan
textViewDidChange:
metodeUITextViewDelegate
protokol, dan beri tahutableView
untuk mengecat ulang sendiri setiap kali teks diedit:Dan jangan lupa mengatur
UITextView
delegasi di suatu tempat, baik di dalamStoryboard
atau ditableView:cellForRowAtIndexPath:
sumber
tableView.rowHeight = UITableViewAutomaticDimension
itu tidak perlu.Solusi kerja yang sangat mudah menggunakan kode dan storyboard keduanya.
Dengan kode
Oleh Storyboard
Hapus centang pada Scrolling Enable
Tidak perlu melakukan apa pun selain ini.
sumber
Cepat:
sumber
textView.scrollEnabled = false
Dalam pengalaman saya (terbatas),
tidak menghormati karakter baris baru, sehingga Anda bisa berakhir dengan jauh lebih pendek
CGSize
daripada yang sebenarnya diperlukan.tampaknya menghormati baris baru.
Selain itu, teks tidak benar-benar ditampilkan di bagian atas
UITextView
. Dalam kode saya, saya mengatur tinggi baruUITextView
menjadi 24 piksel lebih besar dari tinggi yang dikembalikan olehsizeOfFont
metode.sumber
Di iOS6, Anda dapat memeriksa
contentSize
properti UITextView tepat setelah Anda mengatur teks. Di iOS7, ini tidak akan berfungsi lagi. Jika Anda ingin memulihkan perilaku ini untuk iOS7, tempatkan kode berikut di subkelas UITextView.sumber
Saya akan memposting solusi yang tepat di bagian bawah halaman jika seseorang berani (atau cukup putus asa) untuk membaca sampai titik ini.
Berikut adalah repo gitHub untuk mereka yang tidak ingin membaca semua teks itu: resizableTextView
Ini berfungsi dengan iOs7 (dan saya yakin itu akan bekerja dengan iOs8) dan dengan autolayout. Anda tidak perlu angka ajaib, nonaktifkan tata letak dan hal-hal seperti itu.Solusi singkat dan elegan.
Saya pikir, semua kode terkait kendala harus menuju ke
updateConstraints
metode. Jadi, mari kita buat sendiriResizableTextView
.Masalah pertama yang kami temui di sini adalah yang tidak tahu ukuran konten asli sebelum
viewDidLoad
metode. Kita bisa mengambil jalan yang panjang dan buggy dan menghitungnya berdasarkan ukuran font, penghentian baris, dll. Tapi kita membutuhkan solusi yang kuat, jadi kita akan melakukan:CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Jadi sekarang kita tahu sebenarnya contentSize di mana pun kita berada: sebelum atau sesudah
viewDidLoad
. Sekarang tambahkan batasan ketinggian pada textView (melalui storyboard atau kode, tidak peduli bagaimana). Kami akan menyesuaikan nilai itu dengancontentSize.height
:Hal terakhir yang harus dilakukan adalah memberi tahu superclass
updateConstraints
.Sekarang kelas kita terlihat seperti:
ResizableTextView.m
Cantik dan bersih, bukan? Dan Anda tidak harus berurusan dengan kode itu di controller Anda !
Tapi tunggu! Y TANPA ANIMASI!
Anda dapat dengan mudah menghidupkan perubahan untuk melakukan
textView
peregangan dengan lancar. Berikut ini sebuah contoh:sumber
CGFLOAT_MAX
, bukanFLT_MAX
.Apakah kamu sudah mencoba?
[textView sizeThatFits:textView.bounds]
?Sunting: sizeThatFits mengembalikan ukuran tetapi sebenarnya tidak mengubah ukuran komponen. Saya tidak yakin apakah itu yang Anda inginkan, atau apakah
[textView sizeToFit]
lebih dari yang Anda cari. Dalam kedua kasus, saya tidak tahu apakah itu akan cocok dengan konten yang Anda inginkan, tetapi ini adalah hal pertama yang harus dicoba.sumber
Metode lain adalah menemukan ukuran string tertentu akan mengambil menggunakan
NSString
metode ini:-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
Ini mengembalikan ukuran kotak yang cocok dengan string yang diberikan dengan font yang diberikan. Masukkan ukuran dengan lebar yang diinginkan dan tinggi maksimum, dan kemudian Anda dapat melihat ketinggian yang dikembalikan agar sesuai dengan teks. Ada versi yang memungkinkan Anda menentukan mode jeda baris juga.
Anda kemudian dapat menggunakan ukuran yang dikembalikan untuk mengubah ukuran tampilan Anda agar sesuai.
sumber
Jika Anda tidak memiliki perangkat
UITextView
praktis (misalnya, Anda mengukur sel tampilan tabel), Anda harus menghitung ukuran dengan mengukur string, lalu menghitung 8 pt bantalan pada setiap sisi aUITextView
. Misalnya, jika Anda mengetahui lebar tampilan teks yang diinginkan dan ingin mengetahui ketinggian yang sesuai:Di sini, masing-masing 8 adalah akuntansi untuk salah satu dari empat tepi empuk, dan 100000 hanya berfungsi sebagai ukuran maksimum yang sangat besar.
Dalam praktiknya, Anda mungkin ingin menambahkan ekstra
font.leading
pada ketinggian; ini menambahkan baris kosong di bawah teks Anda, yang mungkin terlihat lebih baik jika ada kontrol berat secara visual langsung di bawah tampilan teks.sumber
Kita bisa melakukannya dengan kendala.
2.Buat IBOutlet untuk batasan ketinggian itu.
3. jangan lupa untuk mengatur delegasi untuk tampilan teks Anda.
4.
kemudian perbarui kendala Anda seperti ini :)
sumber
Hal-hal berikut sudah cukup:
UITextView
:Anda bahkan dapat menggunakan
UITableViewAutomaticDimension
.sumber
Dikombinasikan dengan jawaban Mike McMaster, Anda mungkin ingin melakukan sesuatu seperti:
sumber
Saya menemukan cara untuk mengubah ukuran ketinggian bidang teks sesuai dengan teks di dalamnya dan juga mengatur label di bawahnya berdasarkan ketinggian bidang teks! Ini kodenya.
sumber
Cowok yang menggunakan autolayout dan sizetofit Anda tidak berfungsi, maka silakan periksa batasan lebar Anda satu kali. Jika Anda melewatkan batasan lebar maka ketinggiannya akan akurat.
Tidak perlu menggunakan API lainnya. hanya satu baris yang akan memperbaiki semua masalah.
Di sini, saya hanya mementingkan ketinggian, menjaga lebar tetap dan telah melewatkan batasan lebar TextView saya di storyboard.
Dan ini untuk menampilkan konten dinamis dari layanan.
Semoga ini bisa membantu ..
sumber
Dimulai dengan iOS 8, dimungkinkan untuk menggunakan fitur tata letak otomatis dari UITableView untuk secara otomatis mengubah ukuran UITextView tanpa kode kustom sama sekali. Saya telah meletakkan sebuah proyek di github yang menunjukkan hal ini dalam tindakan, tetapi inilah kuncinya:
rowHeight
untukUITableViewAutomaticDimension
.sumber
Saya meninjau semua jawaban dan semuanya menjaga lebar tetap dan hanya menyesuaikan ketinggian. Jika Anda ingin menyesuaikan lebar juga, Anda dapat dengan mudah menggunakan metode ini:
jadi saat mengonfigurasi tampilan teks Anda, atur scroll dinonaktifkan
dan kemudian dalam metode delegasikan
func textViewDidChange(_ textView: UITextView)
tambahkan kode ini:Output:
sumber
Ini berfungsi dengan baik ketika saya perlu membuat teks dalam
UITextView
area tertentu:sumber
di sini adalah versi cepat dari @jhibberd
sumber
nonaktifkan scrolling
tambahkan kendala
dan tambahkan teks Anda
jika Anda menggunakan
UIScrollView
Anda harus menambahkan ini juga;sumber
Untuk iOS 7.0, alih-alih mengatur
frame.size.height
kecontentSize.height
(yang saat ini tidak melakukan apa-apa) digunakan[textView sizeToFit]
.Lihat pertanyaan ini .
sumber
Menggunakan UITextViewDelegate adalah cara termudah:
sumber
Semoga ini membantu:
sumber
textView.frame
.jika ada yang lain dapatkan di sini, solusi ini berfungsi untuk saya, 1 "Ronnie Liew" +4 "user63934" (Teks saya tiba dari layanan web): perhatikan 1000 (tidak ada yang bisa sebesar ini "dalam kasus saya")
Dan itu ... Ceria
sumber
Cara terbaik yang saya temukan untuk mengukur ulang ketinggian UITextView sesuai dengan ukuran teks.
atau Anda bisa MENGGUNAKAN
sumber
Bagi mereka yang ingin tampilan teks benar-benar bergerak ke atas dan mempertahankan posisi garis bawah
sumber
Satu-satunya kode yang akan berfungsi adalah kode yang menggunakan 'SizeToFit' seperti pada jhibberd jawaban di atas tetapi sebenarnya tidak akan mengambil kecuali Anda memanggilnya di ViewDidAppear atau mengirimnya ke teks UITextView mengubah acara.
sumber
Berdasarkan jawaban Nikita Took, saya menemukan solusi berikut di Swift yang bekerja di iOS 8 dengan autolayout:
sumber
Jawaban cepat: Kode berikut menghitung ketinggian textView Anda.
Sekarang Anda dapat mengatur ketinggian textView Anda
myTextHeight
sumber
let attribute = [NSFontAttributeName: textView.text.font!]
Apakah ini benar-benar kode Swift tanpa kesalahan?) Apakah maksud Andalet attribute = [NSFontAttributeName: textView.font!]