IOS7: UIScrollView diimbangi di UINavigationController

126

Saat ini saya sedang memigrasi aplikasi saya di ios 7 dan saya telah terjebak selama berjam-jam di manajemen navigasi bar / baru.

Sebelumnya, ketika kami memiliki pengontrol navigasi, kami memiliki cuplikan seperti ini:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

Di pembangun antarmuka, kami memiliki pilihan untuk menetapkan bilah navigasi yang ada untuk tampilan dan semuanya cocok dengan konten tampilan sebenarnya.

OK jadi sekarang, saya tidak tahu bagaimana mendesain dengan benar dengan pembangun antarmuka. Saya masih punya cuplikan untuk menginisialisasi navcontroller saya. Namun dalam pembangun antarmuka untuk MainViewController saya jika saya menetapkan bilah status ke bilah navigasi transparan atau buram, saya memiliki offset 44px di bagian atas (lihat di bawah).


Pembuat Antarmuka_________________________Dan hasilnya


Sekarang, jika saya mengatur bilah status ke none, tidak ada offset di atas tetapi karena tampilan pada simulator lebih kecil karena bilah navigasi bagian bawah tampilan di pembangun antarmuka terputus.

Pembuat Antarmuka_________________________Dan hasilnya

Saya kira saya benar-benar kehilangan sesuatu di sini tetapi saya tidak dapat menemukan topik atau info apel di iOS7 Transitions Guide tentang itu.

Terima kasih atas bantuan Anda


EDIT

Seperti yang dapat kita lihat dalam gambar, anak pertama dari tampilan adalah UIScrollView yang berisi kedua label, masalahnya tidak muncul ketika tidak ada scrollview. Itu juga muncul jika itu adalah UITableView. Jika label di luar UIScrollView, tidak ada offset untuk label itu.

streem
sumber
Anda mungkin ingin menggunakan Autolayout jika tidak, sehingga Anda dapat memastikan bahwa pandangan tertentu berada pada jarak tertentu dari atas / bawah / sisi layar
erdekhayser
Saya memang tidak menggunakan Autolayout, tetapi menggunakannya (mencentang kotak) tidak menyelesaikan masalah.
streem
Dengan Autolayout, Anda harus menetapkan batasan agar tampilan tetap di tempatnya. Xcode tidak tahu apa yang Anda inginkan secara otomatis.
erdekhayser
Melihat hasil edit Anda sebelumnya, saya baru saja menemukan masalah Anda. Sayangnya, itu bukan solusi yang paling jelas. Daripada mencoba menjelaskannya lagi, saya menggunakan video ini di Youtube untuk mempelajari cara mengatur tampilan gulir. youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be Semoga Sukses. Saya perlu beberapa kali untuk menontonnya untuk sepenuhnya memahami apa yang dia lakukan.
erdekhayser

Jawaban:

286

OK jadi saya menemukan solusinya, saya telah mengatur di controller saya properti:

self.automaticallyAdjustsScrollViewInsets = false

Saya tidak benar-benar mengerti manfaat sebenarnya dari properti ini, (atau mengapa nilai defaultnya benar)

Satu-satunya dokumentasi yang saya temukan ada di sana:

Memperbarui

Di iOS 11 automaticallyAdjustsScrollViewInsetssudah usang

Anda sekarang harus menggunakan:

self.tableView.contentInsetAdjustmentBehavior = .never

Saya juga mendorong Anda untuk memeriksa pertanyaan ini dan jawabannya untuk mendapatkan pemahaman yang lebih baik tentang properti-properti itu

streem
sumber
12
Great ditemukan. UIScrollView di storyboard sangat rumit. Saya berharap Apple membuatnya sedikit mulus di versi Xcode masa depan.
p0lAris
4
Kode ini mencegah saya UIScrollViewdari bergulir. Tetapi tanpa ini saya tidak bisa menyingkirkan offset. Weired ...
scaryguy
9
Bendera ini juga dapat dimatikan di storyboard / nib Anda, Pengontrol Tampilan memiliki kotak centang "Sesuaikan Scroll View Insets". Saya telah membenturkan kepala saya ke dinding begitu lama sekarang mencoba untuk menyelesaikan masalah saya dengan tampilan gulir dan tata letak otomatis, lebih rumit dengan mendukung iOS 6 & 7. Jadi terima kasih banyak untuk akhirnya memberikan solusi!
Newtz
2
Dokumen aplikasi akan memberi tahu Anda bahwa pengaturan navigationbar.translucent = YES akan mencegah navigasibar menekan konten ke bawah. Itu adalah kebohongan terbesar dan menghabiskan banyak waktu untuk pekerjaan saya sampai posting ini. Selain itu, Anda harus menetapkan self.automaticallyAdjustsScrollViewInsets = TIDAK; Terima kasih banyak untuk posting ini !!!!!!! Apel dan apel?
user779764
Saya menemukan bahwa ini menyebabkan batas UIScrollView saya bergeser ke bawah dengan ketinggian nav bar (-64points). Saya secara manual mengesampingkan ini ke 0, tetapi menemukan UISrollView masih akan gulir di sumbu y, dan "jepret" ke garis imajiner di -64. Solusi Anda memecahkan ini.
gdbj
92

@Jawaban Justafinger bekerja seperti pesona bagi saya juga.

Hanya ingin menambahkan bahwa pengaturan ini juga dapat disesuaikan dengan mudah dari pembangun antarmuka.

  1. Pilih pengontrol tampilan Anda
  2. Klik tab 'Atribut Inspector'
  3. Hapus centang 'Sesuaikan Scroll View Insets'
  4. Nikmati!

masukkan deskripsi gambar di sini

Myxtic
sumber
Menghabiskan waktu mencari opsi ini di properti UIScrollView dan bukan View Controller! Terima kasih!
Dominic Williams
11

Saya mengalami masalah yang sama, tapi saya menemukan properti yang agak aneh pada ViewController di pembuat antarmuka yang tampaknya telah menyebabkan ini untuk saya. Ada kotak centang "Perpanjang Tepi". Saya menghapus centang "Di Bawah Bilah Atas", dan semuanya mulai berjalan dengan baik untuk saya.

Ben Nicholas
sumber
Yup, ini bekerja untuk saya lebih baik daripada "Sesuaikan Scroll View Insets"
Dmytro
2

Dengan secara otomatisAdjustsScrollViewInsets diatur ke YA (pengaturan default) ada ketidakcocokan dalam posisi scrollview antara ios6 dan ios7, jadi untuk membuatnya konsisten Anda perlu menonaktifkan pengaturan ini. Namun, ios6 akan macet jika menemukan secara otomatisAdjustsScrollViewInsets, jadi Anda harus melakukan perubahan terprogram secara otomatisAdjustsScrollViewInsets bersyarat pada ios7 atau matikan opsi menggunakan storyboard / NIB

bodoh
sumber
2

Saya memiliki masalah yang sama, setelah mengabaikan viewController, contentOffset dari tableView saya diubah menjadi (0, -64).

solusi saya agak aneh, saya mencoba semua jawaban lain tetapi tidak berhasil, satu-satunya hal yang memperbaiki masalah saya adalah mengganti posisi tableView di pohon kontrol .xib

itu adalah kontrol pertama di Tampilan induk seperti ini:

sebelum

Saya memindahkan tableView tepat setelah ImageView dan berhasil:

setelah

tampaknya menempatkan tampilan tabel di posisi pertama menyebabkan masalah, dan memindahkan tampilan tabel ke posisi lain memperbaiki masalah.

PD Saya tidak menggunakan autoLayout baik storyboard

Semoga ini bisa membantu seseorang!

Chuy47
sumber
Saya perhatikan perilaku aneh ini, saya percaya logika di baliknya adalah scrollViewInsets secara otomatis disesuaikan ketika scrollview adalah anak pertama. Kalau tidak, itu tidak masuk akal karena scrollview Anda mungkin bukan layar penuh.
streem
1

Saya juga menghadapi masalah ini.

UIScrollView ukuran konten dihitung oleh OS sebagai ukuran lain, asal disediakan oleh sistem kendala - itu sebabnya OS memiliki keraguan.

Cara memperbaiki - Anda harus secara eksplisit menentukan ukuran konten UIScrollView:

  1. Sematkan konten yang dapat digulir ke UIView(saya ganti namanya menjadiContentView )
  2. Tambahkan batasan:

ContentView.Weight = View.Weight dan ContentView.Height = View.Height

masukkan deskripsi gambar di sini

Maslovsa
sumber
0

Sepertinya solusi penyelesaiannya adalah dengan melihat file storyboard sebagai "iOS 6.1 dan yang lebih lama" (pilih file storyboard-> File inspector-> Interface Builder Document-> View As. Subviews posisi dalam mode ini menunjukkan offset.

switman
sumber
Yah, saya tidak menggunakan storyboard. Namun saya tidak yakin ini masalah ios6 ke ios7, contoh di atas telah sepenuhnya dibuat dengan iOS 7. Selain itu, saya mengedit pertanyaan saya, hanya muncul (sejauh yang saya tahu) dengan uiscrollview dan uitableview.
streem
Hmm menarik ... Melihat ini, Anda dapat menambahkan varian = "6xAndEarlier" ke bagian atas XIB dalam elemen dokumen, karena ini adalah perbedaan ketika membalikkan bit yang saya sebutkan di atas. Dan FYI masalah ini juga terjadi pada uiwebview untuk saya.
swhitman
0

Terima kasih kawan atas solusinya! Saya berjuang selama berjam-jam mencoba menyelesaikan masalah. Semuanya baik-baik saja ketika tidak ada Bar Navigasi yang terlibat tapi itu rusak ketika saya menanamkan ViewController di NavigationController.

Saya menyelesaikannya dengan menghapus centang pada Adjust Scroll View Insets dan Under Top Bars . Keduanya terletak di Inspektur Atribut ViewController. Terima kasih banyak!

Jackson Gan
sumber