Saya memiliki tampilan yang memiliki ketinggian dinamis dan saya mencoba mengubah prioritas tinggi tampilan ini dalam waktu proses.
Ini bagian dari kode saya;
if (index == 0) {
surveyViewHeightConstraint.constant = 0;
surveyViewHeightConstraint.priority = 1000;
} else if (index == 1) {
surveyViewHeightConstraint.constant = 163;
surveyViewHeightConstraint.priority = 500;
}
Saya mengubah indeks dengan aksi tombol. Ketika saya menjalankan kode ini, saya mendapatkan kesalahan ini:
*** Assertion failure in -[NSLayoutConstraint setPriority:], /SourceCache/Foundation/Foundation-1141.1/Layout.subproj/NSLayoutConstraint.m:174
Apa kesalahan saya disini?
sumber
required
menjadidefaultLow
dan berhasil. Kode yang sama digunakan untuk mogok di iOS 12.Saya ingin memberi sedikit tambahan pada jawaban Cyrille.
Jika Anda membuat batasan dalam kode, pastikan untuk menyetel prioritasnya sebelum membuatnya aktif. Misalnya:
surveyViewHeightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeHeight multiplier:1 constant:0]; surveyViewHeightConstraint.active = YES; surveyViewHeightConstraint.priority = 999;
Ini akan menghasilkan pengecualian waktu proses.
Urutan yang benar adalah:
surveyViewHeightConstraint.priority = 999; surveyViewHeightConstraint.active = YES;
Untuk Swift versi 4+
constraintName.priority = UILayoutPriority(rawValue: 999)
sumber
Versi Swift:
myContraint.priority = UILayoutPriority(999.0)
sumber
Cara kami selalu menangani ini adalah dengan tidak mengubah konstanta kendala, cukup prioritasnya. Misalnya, dalam situasi Anda memiliki dua kendala ketinggian.
heightConstraintOne (who's height is set in the storyboard at 150, and priority set at 750) heightConstraintTwo (who's height is set in the storyboard at 0, and priority set at 250)
jika Anda ingin menyembunyikan tampilan, Anda:
heightConstraintTwo.priority = 999;
Begitu pula jika Anda ingin memperlihatkan tampilan:
heightConstraintTwo.priority = 250;
sumber
Saya berharap skenario ini membantu seseorang: Saya memiliki dua kendala, bahwa mereka berlawanan satu sama lain, maksud saya mereka tidak dapat puas dalam waktu yang sama, dalam pembuat antarmuka salah satunya memiliki prioritas 1000 dan lainnya memiliki prioritas kurang dari 1000. ketika saya mengubahnya dalam kode, saya mengalami kesalahan ini:
Menghentikan aplikasi karena pengecualian yang tidak tertangkap 'NSInternalInconsistencyException', alasan: 'Mengubah prioritas dari wajib menjadi tidak pada batasan yang terpasang (atau sebaliknya) tidak didukung. Anda melewati prioritas 250 dan prioritas yang ada adalah 1000. '
kemudian saya hanya menginisialisasi mereka dalam fungsi viewDidLoad dengan nilai .defaultHigh dan .defaultLow dan ini memperbaiki masalah saya.
sumber
Menurut
NSLayoutConstraints class
di dalamUIKit Module
Contoh: -
UIButton
kendala dengan berbagai prioritas -func setConstraints() { buttonMessage.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint(item: buttonMessage, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: -10).isActive = true let leading = NSLayoutConstraint(item: buttonMessage, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 10) leading.isActive = true let widthConstraint = NSLayoutConstraint(item: buttonMessage, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 100) let heightConstraint = NSLayoutConstraint(item: buttonMessage, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 50) let trailingToSuperView = NSLayoutConstraint(item: buttonMessage, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1, constant: 0) trailingToSuperView.priority = 999 trailingToSuperView.isActive = true //leading.isActive = false//uncomment & check it will align to right of the View buttonMessage.addConstraints([widthConstraint,heightConstraint]) }
sumber
viewDidLayoutSubviews
. Metode itu bisa dipanggil beberapa kali, yang bisa membuat aplikasi Anda mogok jika Anda membuat batasan duplikat di sana.Saya menghadapi masalah yang sama. Karena beberapa jawaban yang disebutkan di atas di iOS 13 mengubah prioritas akan berfungsi dengan baik, Namun di iOS 12 itu akan menyebabkan crash.
Saya dapat memperbaiki masalah ini dengan membuat IBOutlet NSLayoutConstraint ke batasan khusus di Storyboard yang mempertahankan prioritasnya ke 1000, di bawah ini adalah kode untuk memperbaikinya.
if (Condition) { surveyViewHeightConstraint.constant = 0; surveyViewHeightConstraint.isActive = false; } else if (index == 1) { surveyViewHeightConstraint.constant = 163; surveyViewHeightConstraint.isActive = True; }
Semoga ini membantu!!! Bersulang
sumber
Sekarang Anda bisa, cukup gunakan koneksi IBOutlet untuk batasan Anda, lalu gunakan kode ini.
self.webviewHeight.priority = UILayoutPriority(rawValue: 1000)
sumber