Saya mengalami masalah dengan kode saya. Saya mencoba untuk memindahkan UIScrollView
saat saya mengedit UITextField
yang seharusnya disembunyikan oleh pop keyboard.
Saya memindahkan bingkai utama sekarang karena saya tidak tahu cara 'menggulir ke atas' dalam kode. Jadi, saya melakukan sedikit kode, itu berfungsi dengan baik tetapi ketika saya mengedit bidang teks UI dan saya beralih ke yang lain UITextField
tanpa menekan tombol 'kembali', tampilan utama berjalan jauh ke atas.
Saya melakukan NSLog()
dengan ukuran variabel saya, jarak dan textFieldRect.origin.y seperti yang Anda lihat di bawah. Ketika saya meletakkan dua UITextField
di tempat yang sama (asal y) dan saya melakukan 'saklar' khusus ini (tanpa menekan kembali), saya mendapatkan nomor yang sama, sedangkan kode saya berfungsi dengan baik untuk UITextField
pengeditan pertama tetapi tidak untuk pengeditan kedua.
Lihat ini:
- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
int size;
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
size = textFieldRect.origin.y + textFieldRect.size.height;
if (change == FALSE)
{
size = size - distance;
}
if (size < PORTRAIT_KEYBOARD_HEIGHT)
{
distance = 0;
}
else if (size > PORTRAIT_KEYBOARD_HEIGHT)
{
distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
}
NSLog(@"origin %f", textFieldRect.origin.y);
NSLog(@"size %d", size);
NSLog(@"distance %d", distance);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
change = FALSE;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
change = TRUE;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += distance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
Ada ide?
sumber
activeField.frame
ke bingkai relatif karenaactiveField
tidak harus menjadi anak langsungself.view
. Kode yang diperbarui akan terlihat seperti ini:CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }
UIKeyboardFrameEndUserInfoKey
kunci di iOS 11 karenaUIKeyboardFrameBeginUserInfoKey
sering memberi saya ketinggian nol.Saya baru saja menerapkan ini dengan Swift 2.0 untuk iOS9 di Xcode 7 (beta 6), berfungsi dengan baik di sini.
Diedit untuk Swift 3
Sepertinya Anda hanya perlu mengatur
contentInset
danscrollIndicatorInset
dengan Swift 3, scrolling / contentOffset dilakukan secara otomatis ..sumber
Semua jawaban di sini sepertinya melupakan kemungkinan lanskap. Jika Anda ingin ini berfungsi saat perangkat diputar ke tampilan lanskap, maka Anda akan menghadapi masalah.
Kuncinya di sini adalah bahwa meskipun tampilan menyadari orientasinya, keyboard tidak. Ini berarti dalam Landscape, lebar keyboard sebenarnya adalah tinggi dan sebaliknya.
Untuk memodifikasi Apel cara yang disarankan untuk mengubah insets konten dan membuatnya mendukung orientasi lanskap, saya akan merekomendasikan menggunakan yang berikut ini:
Bagian yang perlu diperhatikan di sini adalah sebagai berikut:
Apa yang dilakukannya, adalah mendeteksi orientasi perangkat. Jika lanskap, itu akan 'menukar' nilai lebar dan tinggi dari variabel keyboardSize untuk memastikan bahwa nilai yang benar digunakan di setiap orientasi.
sumber
Solusi Swift 4 :
sumber
UIKeyboardFrameBeginUserInfoKey
keUIKeyboardFrameEndUserInfoKey
UIKeyboardWillShow
,UIKeyboardWillHide
, DanUIKeyboardFrameBeginUserInfoKey
telah berganti nama menjadiUIResponder.keyboardWillShowNotification
,UIResponder.keyboardWillHideNotification
, danUIResponder.keyboardFrameBeginUserInfoKey
.Untuk hal ini tidak perlu banyak coding, sangat mudah seperti kode di bawah ini: -
Anda semua textfiled di UIScrollview dari nib seperti gambar ini: -
YourViewController.h
menghubungkan IBOutlet dari nib dan juga menghubungkan setiap delegasi UItextfiled dan delegasi scrollview dari NIB
CATATAN jika Delegasi yang diajukan teks tidak terhubung maka tidak ada metode yang berfungsi, harap pastikan bahwa semua iBOulate dan delegasi terhubung dengan benar
sumber
Rekomendasi Apple dikodekan ulang di Swift + Menggunakan UIScrollView dengan Tata Letak Otomatis di iOS (berdasarkan tautan berikut ini: tautan 1 , tautan 2 , tautan 3 ):
sumber
Satu-satunya hal yang akan saya perbarui dalam kode Apple adalah metode keyboardWillBeHidden:, untuk memberikan transisi yang mulus.
sumber
Berikut adalah jawaban yang kompatibel dengan Swift 3 , yang juga akan bekerja dengan pengontrol tampilan dalam pengontrol navigasi - karena mereka akan mengubah
contentInset.top
properti tampilan gulir .sumber
Solusi Swift 4.2 yang mempertimbangkan kemungkinan ketinggian UIToolbar dan UITabBar.
Dan, jika Anda menargetkan <iOS 9, Anda harus membatalkan pendaftaran pengamat di beberapa titik (terima kasih Joe )
sumber
Saya telah menemukan jawaban di atas sudah ketinggalan zaman. Juga tidak sempurna saat menggulir.
Ini versi cepatnya.
Ini akan menggulir tepat di bawah textField, tidak ada ruang kosong. Dan itu akan mengembalikan seperti semula.
sumber
Inilah yang saya gunakan. Sederhana dan bekerja dengan baik.
Gunakan
UITextField
panggilan delegasitextFieldDidBeginEditing:
untuk menggeser tampilan Anda ke atas, dan juga tambahkan pengamat notifikasi untuk mengembalikan tampilan ke normal saat keyboard menyembunyikan:sumber
Ini adalah kode terakhir dengan peningkatan di Swift
sumber
Salah satu solusi termudah adalah menggunakan protokol berikut:
Saat Anda ingin menggunakan protokol ini, Anda hanya perlu mematuhinya dan menetapkan tampilan gulir Anda di pengontrol sebagai berikut:
sumber
Saya akan melakukan itu seperti ini. Ini banyak kode tetapi memastikan, bahwa textField yang saat ini fokus berada di tengah vertikal di 'ruang yang tersedia':
Perhatikan bahwa
- (IBAction)textFieldGotFocus:
tindakan tersebut terhubung ke setiap bidang teksDidBeginEditing
.Juga akan sedikit lebih baik untuk mendapatkan durasi animasi dari notifikasi keyboard dan menggunakannya untuk animasi scrollview daripada nilai tetap, tapi tuntut saya, ini cukup bagus untuk saya;)
sumber
Gunakan ekstensi berikut jika Anda tidak ingin menghitung terlalu banyak:
Dan mungkin Anda ingin UITextField Anda selalu terlihat:
sumber
Coba kode ini di Swift 3:
sumber
Solusi Swift 5 berdasarkan solusi Masa di atas - perubahan terkait dengannya:
keyboardFrameEndUserInfoKey
alih-alihkeyboardFrameBeginUserInfoKey
, karenakeyboardFrameBeginUserInfoKey
can on first show mengembalikan nilai lain seperti yang dijelaskan misalnya di sini: tinggi keyboard bervariasi saat munculUIResponder.keyboardWillShowNotification
/UIResponder.keyboardWillHideNotification
bukanNSNotification.Name.UIKeyboardDidShow
/NSNotification.Name.UIKeyboardDidHide
Kode:
sumber
Anda sebenarnya tidak memerlukan UIScrollView untuk melakukan ini. Saya menggunakan kode ini dan berfungsi untuk saya:
sumber
Anda dapat menggulir dengan menggunakan properti
contentOffset
diUIScrollView
, misalnya,Ada juga metode untuk melakukan pengguliran animasi.
Adapun alasan mengapa pengeditan kedua Anda tidak bergulir dengan benar, itu mungkin karena Anda menganggap bahwa keyboard baru akan muncul setiap kali pengeditan dimulai. Anda dapat mencoba memeriksa apakah Anda telah menyesuaikan untuk posisi terlihat "keyboard" (dan juga memeriksa visibilitas keyboard saat ini sebelum mengembalikannya).
Solusi yang lebih baik mungkin mendengarkan notifikasi keyboard, misalnya:
sumber
Saya tahu ini pertanyaan lama sekarang tetapi saya pikir itu mungkin membantu orang lain. Saya ingin sesuatu yang sedikit lebih mudah diterapkan untuk beberapa aplikasi yang saya miliki, jadi saya membuat kelas untuk ini. Anda dapat mengunduhnya di sini jika Anda mau: https://github.com/sdernley/iOSTextFieldHandler
Ini sesederhana mengatur semua UITextFields untuk memiliki delegasi diri
Dan kemudian menambahkan ini ke pengontrol tampilan Anda dengan nama scrollView dan tombol kirim
sumber
Berikut ini adalah solusi saya yang berfungsi (5 langkah)
Langkah 1: Tambahkan pengamat untuk menangkap UITEXTFIELD atau UITEXTVIEW ShoudBeginEditing mana (di mana objek inited atau ViewDidLoad.
Langkah2: Posting pemberitahuan ketika ..ShouldBeginEditing dengan OBJECT of UITEXTFIELD atau UITEXTVIEW
Langkah3: Metode yang (Langkah1 memanggil) menetapkan UITEXTFIELD atau UITEXTVIEW saat ini
Langkah4: Tambahkan pengamat Keyboard UIKeyboardWillShowNotification (tempat yang sama seperti Langkah1)
dan metode:
Langkah 5: Tambahkan pengamat Keyboard UIKeyboardWillHideNotification (tempat yang sama seperti langkah 1)
dan metode:
Ingatlah untuk menghapus pengamat!
sumber
Saya menggunakan jawaban yang diberikan oleh Sudheer Palchuri https://stackoverflow.com/users/2873919/sudheer-palchuri https://stackoverflow.com/a/32583809/6193496
Di ViewDidLoad, daftarkan notifikasi:
Tambahkan di bawah metode pengamat yang melakukan pengguliran otomatis saat keyboard muncul.
sumber
Solusi saya memiliki 4 langkah:
- Langkah 1: fungsi mendengarkan saat keyboard muncul
- Langkah 2: fungsi mendengarkan saat keyboard menghilang
- Langkah 3: tambahkan fungsi ini ke pusat notifikasi:
- Langkah 4: hapus dengarkan saat pengontrol tampilan menghilang
sumber