Saya baru saja memigrasi beberapa kode ke SDK iOS 11 beta 5 yang baru.
Sekarang saya mendapatkan perilaku yang sangat membingungkan dari UITableView. Tableview itu sendiri tidak terlalu mewah. Saya memiliki sel khusus tetapi sebagian besar hanya untuk tinggi mereka.
Ketika saya mendorong pengontrol tampilan saya dengan tampilan tabel, saya mendapatkan animasi tambahan di mana sel "gulir ke atas" (atau mungkin seluruh bingkai tampilan tabel diubah) dan ke bawah di sepanjang animasi navigasi push / pop. Silakan lihat gif:
Aku manual membuat tableview
diloadView
metode dan tata letak auto pengaturan kendala untuk menjadi sama dengan memimpin, mengikuti, atas, bawah SuperView tableview ini. Superview adalah tampilan root dari pengontrol tampilan.
Lihat pengontrol yang mendorong kode sangat standar: self.navigationController?.pushViewController(notifVC, animated: true)
Kode yang sama memberikan perilaku normal di iOS 10.
Bisakah Anda menunjukkan kepada saya apa yang salah?
EDIT: Saya telah membuat pengontrol tableview yang sangat sederhana dan saya dapat mereproduksi perilaku yang sama di sana. Kode:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
EDIT 2: Saya dapat mempersempit masalah ke kustomisasi UINavigationBar saya. Saya memiliki kustomisasi seperti ini:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
dimana createFilledImage
membuat gambar persegi dengan ukuran dan warna tertentu.
Jika saya mengomentari baris ini saya mendapatkan kembali perilaku normal.
Saya sangat menghargai pemikiran apapun tentang masalah ini.
navigationBar.isTranslucent
untukfalse
, jika tidak bekerja dengan baik.Jawaban:
Ini karena properti baru
UIScrollView's
(UITableView adalah subclass dari UIScrollview)contentInsetAdjustmentBehavior
, yang disetel ke.automatic
default.Anda dapat mengganti perilaku ini dengan cuplikan berikut di viewDidLoad dari pengontrol yang terpengaruh:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
sumber
tableView.contentInsetAdjustmentBehavior
akan merusak insets.contentInsetAdjustmentBehavior
ke.never
bukanlah solusi yang bagus karena kemungkinan besar akan memiliki efek samping lain yang tidak diinginkan. Jika Anda menggunakan solusi, Anda harus memastikan untuk menghapusnya untuk versi iOS> = 11.2.Selain jawaban maggy
TUJUAN-C
sumber
Anda dapat mengedit perilaku ini sekaligus di seluruh aplikasi dengan menggunakan NSProxy di misalnya didFinishLaunchingWithOptions:
sumber
Inilah cara saya berhasil memperbaiki masalah ini sambil tetap mengizinkan iOS 11 untuk mengatur insets secara otomatis . Saya menggunakan
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Ini mungkin tidak perlu tetapi itulah yang saya lakukan.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
mungkin juga berfungsi tetapi saya tidak menguji.Satu hal lagi untuk dicoba jika semuanya gagal:
viewSafeAreaInsetsDidChange
UIViewController
Metode override untuk mendapatkan tampilan tabel untuk memaksa mengatur insets tampilan gulir ke insets area aman. Ini terkait dengan pengaturan 'Tidak Pernah' dalam jawaban Maggy.Catatan:
self.tableView
danself.view
harus sama untukUITableViewController
sumber
Ini tampaknya lebih seperti bug daripada perilaku yang dimaksudkan. Itu terjadi ketika bilah navigasi tidak tembus cahaya atau ketika gambar latar belakang disetel.
Jika Anda baru saja mengatur contentInsetAdjustmentBehavior ke .never, inset konten tidak akan diatur dengan benar di iPhone X, misalnya konten akan masuk ke area bawah, di bawah scrollbar.
Ada dua hal yang perlu dilakukan:
1. mencegah scrollView beranimasi pada push / pop
2. mempertahankan perilaku otomatis karena diperlukan untuk iPhone X. Tanpa ini misalnya dalam potret, konten akan berada di bawah scrollbar bawah.
Solusi sederhana baru: di XIB: Cukup tambahkan UIView baru di atas tampilan utama Anda dengan top, leading dan trailing to superview dan height set to 0. Anda tidak perlu menghubungkannya ke subview lain atau apa pun.
Solusi lama:
Catatan: Jika Anda menggunakan UIScrollView dalam mode lanskap, itu masih tidak mengatur insets horizontal dengan benar (bug lain?), Jadi Anda harus memasang pin scrollView's leading / trailing ke safeAreaInsets di IB.
Catatan 2: Solusi di bawah ini juga memiliki masalah bahwa jika tableView di-scroll ke bawah, dan Anda menekan controller dan pop back, itu tidak akan berada di bawah lagi.
sumber
Saya dapat mereproduksi bug untuk iOS 11.1 tetapi tampaknya bug telah diperbaiki sejak iOS 11.2. Lihat http://openradar.appspot.com/34465226
sumber
pastikan bersama kode di atas, tambahkan kode tambahan sebagai berikut. Itu memecahkan masalah
sumber
Juga jika Anda menggunakan bilah tab, inset konten bawah tampilan koleksi akan menjadi nol. Untuk ini, letakkan kode di bawah ini di viewDidAppear:
sumber
Dalam kasus saya ini berhasil (taruh di viewDidLoad):
sumber
Menghapus ruang ekstra di atas
collectionView
atautableView
Di atas kode
collectionView
atau ditableView
bawah bilah navigasi.Kode di bawah ini mencegah tampilan koleksi untuk masuk ke bawah navigasi
tapi saya suka menggunakan logika dan kode di bawah ini untuk UICollectionView
Cara terbaik untuk UICollectionView
sumber
Hapus kode ini berfungsi untuk saya
sumber
Saya menggunakan UISearchController dengan resultControllers khusus yang memiliki tampilan tabel. Mendorong pengontrol baru pada pengontrol hasil menyebabkan tampilan tabel berada di bawah penelusuran.
Kode yang tercantum di atas benar-benar memperbaiki masalah
sumber