Tidak dapat secara bersamaan memenuhi kendala, akan berusaha untuk memulihkan dengan melanggar batasan


145

Di bawah ini adalah pesan kesalahan yang saya terima di area debug. Ini berjalan dengan baik dan tidak ada yang salah kecuali saya menerima kesalahan ini. Apakah ini akan mencegah apel menerima aplikasi? Bagaimana saya memperbaikinya?

2012-07-26 01:58:18.621 Rolo[33597:11303] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
    "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
    "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
    "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
    "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
    "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
    "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
    "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

1
Kesalahan ini hanya akan terjadi di Xcode 4.5, jadi Anda tidak dapat mengirimkannya ke App Store (sampai dirilis)
borrrden

Jadi tidak ada yang salah? Dan mungkinkah menggunakan versi xcode lain untuk dapat dikirimkan ke app store?
Johnny Cox

1
Ya, ada sesuatu yang salah, tetapi tidak relevan karena ada hubungannya dengan fitur iOS yang belum tersedia di versi Xcode publik. Jika dikompilasi dengan 4.4, Anda dapat merilisnya menggunakan versi itu (dirilis hari ini).
borrrden

Saya mendapatkan pesan kesalahan ini untuk aplikasi OS X di Xcode 4.4. Saya tidak mengerti.
Steve McLeod

@ Bartłomiej Semańczyk Bisakah Anda bergabung dengan kamar: chat.stackoverflow.com/rooms/92522/autolayout-and-ios ? Maaf itu acak tetapi akan menghargai saran Anda tentang sesuatu yang terkait tata letak otomatis, terima kasih!
cheznead

Jawaban:


275

Saya akan merekomendasikan untuk debug dan menemukan batasan mana yang "Anda tidak mau" . Misalkan Anda memiliki masalah berikut:

masukkan deskripsi gambar di sini

Selalu masalahnya adalah bagaimana menemukan Kendala dan Tampilan berikut.

Ada dua solusi bagaimana melakukan ini:

  1. DEBUG VIEW HIERARCHY (Jangan rekomendasikan cara ini)

Karena Anda tahu di mana menemukan kendala yang tidak terduga (PBOUserWorkDayHeaderView) ada cara untuk melakukan ini dengan cukup baik. Mari kita temukan UIViewdan NSLayoutConstraintdalam persegi panjang merah. Karena kita tahu id mereka di memori itu cukup mudah.

  • Hentikan aplikasi menggunakan Hirarki Tampilan Debug :

masukkan deskripsi gambar di sini

  • Temukan UIView yang tepat:

masukkan deskripsi gambar di sini

  • Yang berikutnya adalah menemukan NSLayoutConstraint yang kami pedulikan:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, pointer memori sama. Jadi kita tahu apa yang sedang terjadi sekarang. Selain itu, Anda dapat menemukan NSLayoutConstraintdalam hierarki tampilan. Karena dipilih dalam Lihat, itu juga dipilih di Navigator.

masukkan deskripsi gambar di sini

Jika perlu, Anda juga dapat mencetaknya di konsol menggunakan penunjuk alamat:

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

Anda dapat melakukan hal yang sama untuk setiap kendala yang akan ditunjukkan oleh debugger kepada Anda :-) Sekarang Anda memutuskan apa yang harus dilakukan dengan ini.

  1. CETAK LEBIH BAIK (Saya sangat merekomendasikan cara ini, ini dari Xcode 7)

    • setel pengidentifikasi unik untuk setiap kendala dalam tampilan Anda:

masukkan deskripsi gambar di sini

  • buat ekstensi sederhana untuk NSLayoutConstraint:

SWIFT :

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

TUJUAN-C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • bangun sekali lagi, dan sekarang Anda memiliki hasil yang lebih mudah dibaca untuk Anda:

masukkan deskripsi gambar di sini

  • setelah Anda mendapatkannya, idAnda dapat dengan mudah mengetuknya di Find Navigator Anda :

masukkan deskripsi gambar di sini

  • dan dengan cepat menemukannya:

masukkan deskripsi gambar di sini

BAGAIMANA CARA SIMPLE KASUS BAHWA?

  • coba ubah prioritas menjadi 999untuk batasan yang rusak.

Ini baru saja memperbaiki bug saya ... terima kasih banyak. Bagaimana Anda melakukan ini untuk tujuan c? Tambahkan kategori?
cheznead

Terima kasih untuk solusi, tetapi bisakah saya menggunakan ekstensi dalam objektif c?
dev.nikolaz

Apakah pengidentifikasi itu sama dengan accessIdentifier yang tersedia di UIViews secara terprogram? Jika tidak, bagaimana pengidentifikasi dapat diatur secara terprogram?
Arunabh Das

@ Tidak, tidak sama. Baca jawaban ini
Bartłomiej Semańczyk

3
Saya suka cara ke-2 dan saya pikir ini cara terbaik untuk melacak batasan yang rusak
Antarix

108

Masalah yang Anda alami adalah NSAutoresizingMaskLayoutConstraints seharusnya tidak ada di sana. Ini adalah sistem lama pegas dan struts. Untuk menghilangkannya, jalankan metode ini pada setiap tampilan yang ingin Anda batasi:

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

5
apa beberapa alasan untuk tampilan yang tidak muncul sama sekali ketika mengatur setTranslatesAutoresizingMaskIntoConstraints ke NO?
topwik

1
sebagai contoh, saya membuat SSBadgeView (UIView), menambahkan subView imageView ke SSBadgeView, lalu menambahkan SSBAdgeView sebagai subview ke UIReuseableView. Saya menambahkan beberapa batasan pada SSBadgeView dan setTranslatesAutoresizingMaskIntoConstraints: NO pada SSBadgeView. gambar subView dari SSBadgeView diletakkan seperti yang diharapkan tetapi induk SSBadgeView dari gambar tidak terlihat.
topwik

1
Anda lupa menonaktifkan TranslatesAutoresizingMaskIntoConstraints di sub-tampilan Anda
Softlion

Inilah yang terjadi ketika saya menetapkan properti ini, drive.google.com/file/d/0BxuYs8WHXCF7bV9ndHFrQ0dMYVE/... Saya menggunakan baris kode ini: [self.contentView setTranslatesAutoresizingMaskIntoConstraints: NO]; untuk (tampilan UIView * di self.contentView.subviews) {[view setTranslatesAutoresizingMaskIntoConstraints: NO]; } Sebelumnya dulu tampilannya seperti: drive.google.com/file/d/0BxuYs8WHXCF7OWlvZGQwN3FlbzQ/… Itu berfungsi, saya harus mengatakannya.
rptwsthi

28

Hati-hati , agar Anda tidak menggunakan lebih dari satu kendala dalam arah dan jenis yang sama.

Misalnya: Batasan vertikal untuk trailing = 15 dan yang lainnya adalah> = 10.

Terkadang, Xcode membuat beberapa kendala yang tidak Anda perhatikan . Anda harus menyingkirkan kendala yang berlebihan dan peringatan log pasti akan hilang.

masukkan deskripsi gambar di sini

Selain itu, Anda dapat membaca dan mendeteksi beberapa alasan tertentu, langsung dari log :

NSLayoutConstraint: 0xa338390 V: | - (15) - [UILabel: 0xa331260] (Nama: '|': UILabel: 0xa330270)>

Ini bisa kita baca sebagai masalah pada batasan UILabel, ini menyebabkan batas vertikal menjadi 15pt.

NSLayoutConstraint: 0x859ab20 H :-( 13) - | [UIView: 0x85a8fb0] ...

Ini akan menjadi kendala horizontal dll.


6

Saya memiliki cukup banyak pengecualian yang dilemparkan, cara tercepat dan termudah yang saya temukan untuk menyelesaikannya adalah dengan menemukan nilai unik dalam pengecualian yang kemudian saya cari dalam kode sumber storyboard. Ini membantu saya menemukan tampilan aktual dan kendala yang menyebabkan masalah (saya menggunakan label pengguna yang bermakna pada semua tampilan, yang membuatnya jauh lebih mudah untuk melacak kendala dan tampilan) ...

Jadi, dengan menggunakan pengecualian di atas saya akan membuka storyboard sebagai "kode sumber" di xcode (atau editor lain) dan mencari sesuatu yang dapat saya temukan ...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

.. ini terlihat seperti batasan vertikal (V) pada UILabel dengan nilai (17).

Melihat melalui pengecualian saya juga menemukan

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

Yang terlihat seperti label UIL (0x72bf7c0) dekat dengan tombol UIB (0x886efe0) dengan spasi vertikal (8) ..

Mudah-mudahan itu akan cukup bagi saya untuk menemukan pandangan spesifik dalam kode sumber storyboard (mungkin dengan mencari teks "17" pada awalnya), atau setidaknya beberapa kandidat. Dari sana saya harus benar-benar dapat mengetahui pandangan mana yang ada di storyboard yang akan membuatnya lebih mudah untuk mengidentifikasi masalah (mencari pinning "duplikat" atau pinning yang bertentangan dengan batasan ukuran).


"Saya menggunakan userLabels yang berarti" - apakah userLabels dalam konteks ini? (seperti cara Anda mengaturnya)
Stripes

Di bagian Dokumen inspektur identitas adalah bidang "Label" .. yang diterjemahkan ke nilai "userLabel" dalam kode sumber papan cerita.
C James

Anda juga dapat mengaturnya dengan mengklik pada tampilan yang dipilih di sebelah kiri panel "Gambaran Umum" (agak seperti mengganti nama file dalam pencari)
C James

1
Mungkin hal terbaik yang saya baca dalam memecahkan masalah yang ditakuti "Tidak dapat secara bersamaan memenuhi kendala." rasa sakit. Saya menemukan bahwa objek yang ditunjukkan pada titik ini "Akan berusaha untuk memulihkan dengan melanggar batasan <NSLayoutConstraint:" biasanya pelakunya, dan seperti kata C James, Mungkin kendala ketinggian atau lebar yang bertentangan dengan kendala penjepit. Saya merasa sulit untuk menghapus ketinggian tetapi karena kendala itu benar, ketinggian dapat diperoleh dari kendala lainnya. Menambahkan batasan ketinggian hanya membingungkan Tata Letak Otomatis, jadi itulah yang saya cari sekarang.
latenitecoder

6

Saya mengalami kesulitan mencari tahu kendala apa yang menyebabkan kesalahan ini. Inilah cara yang lebih sederhana untuk melakukannya.

Saya menggunakan Xcode 6.1.1

  1. "Command + A" untuk memilih semua UILabels, UIImages, dll.
  2. Klik Editor -> Pin> (Pilih ...) ke Superview
  3. lagi klik Editor -> Selesaikan Masalah Tata Letak Otomatis -> Tambahkan Kendala yang Hilang atau Reset ke Kendala yang Disarankan. Itu tergantung pada kasus Anda.

5

Saya mengalami masalah ini karena .xibfile saya menggunakan autolayout.

Di inspektur file, tab pertama. Menghapus centang "Gunakan Autolayout" menyelesaikan masalah.

inspektur file autolayout


Jadi saya melakukan itu dan itu memperbaiki masalah, tetapi 'UIImageView' yang saya miliki di atas layar (yang saya gunakan sebagai bilah navigasi) dipindahkan ke bagian bawah layar. Apakah Anda tahu mengapa itu terjadi?
dietbacon

1
Autolayout menggunakan batasan untuk mengatur tata letak objek. Karena Anda baru saja menonaktifkan autolayout, kendala ini kemungkinan besar telah hilang dan posisi Anda UIImageViewtelah berubah. Anda harus mengatur posisi ini lagi, baik secara terprogram atau melalui Interface Builder.
Stéphane Bruckert

5

Inilah pengalaman dan Solusi saya. Saya tidak menyentuh kode

  1. Pilih tampilan (UILabel, UIImage dll)
  2. Editor> Pin> (Pilih ...) ke Superview
  3. Editor> Selesaikan Masalah Tata Letak Otomatis> Tambahkan Kendala yang Hilang

4

gunakan swift kode ini

view.translatesAutoresizingMaskIntoConstraints = false

1
Ini adalah jawaban cepat untuk pertanyaan objektif-c-tag.
Tobi Nary

2
@SmokeDispenser Pokoknya saya telah menyebutkan bahwa ini adalah kode cepat. dan itu berhasil untuk saya. cepat / objektif itu adalah SDK sentuhan kakao umum.
Arun Kumar P

2

Saya telah mengikuti pertanyaan dan jawaban SO dari setiap permintaan pencarian. Tetapi mereka semua terkait dengan yang spesifik.

Pada dasarnya, maksud saya sebelum Anda akan menuliskan format (mungkin yang sederhana) itu akan memberi Anda peringatan.

Dari iOS 8.0 secara default tampilan adalah kelas ukuran. Bahkan jika Anda menonaktifkan kelas ukuran itu masih akan berisi beberapa batasan tata letak otomatis.

Jadi jika Anda berencana untuk menetapkan batasan melalui kode menggunakan VFL. Maka Anda harus mengurus satu di bawah garis.

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

Saya sudah banyak mencari di SO, tetapi solusinya terletak pada Apple Sample Code .

Jadi, Anda harus menghapus batasan default sebelum berencana untuk menambahkan yang baru.


1

Bagi saya alasan utama masalah ini adalah bahwa saya lupa untuk menghapus centang AutoLayoutpada Xibeditor. Bahkan, saya melakukan banyak penyesuaian XIBpada kode.


1
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

Ini membantu saya menangkap pandangan yang menyebabkan masalah.


1

Tidak ada jawaban di atas yang membantu dalam situasi saya. Saya menjalankan XCode 10.1 dan menguji aplikasi saya di simulator untuk "iPad (generasi ke-5)". Simulator menjalankan iOS 12.1.

Saya punya tampilan root sederhana di storyboard saya, dengan dua subview UITextField. Tidak ada kendala yang digunakan di storyboard sama sekali. Dan saya tidak punya objek UIButtonBarView di aplikasi atau storyboard.

Tidak ada pesan yang dicetak saat aplikasi diluncurkan dan memunculkan tampilan root. Tidak ada ketika perangkat simulasi diputar.

Namun dalam simulator, saat saya mengklik salah satu bidang teks, ekstensi keyboard muncul dari bagian bawah layar, meskipun bukan keyboard lengkap, yang sepertinya tidak pernah muncul di simulator. Tetapi yang berikut ini dicetak di terminal:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
Try this: 
    (1) look at each constraint and try to figure out which you don't expect; 
    (2) find the code that added the unwanted constraint or constraints and fix it. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSAutoresizingMaskLayoutConstraint:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Jelas bagi saya bahwa semua ini tidak ada hubungannya dengan aplikasi saya, dan semuanya berkaitan dengan bagaimana Apple membuat tampilan keyboard sendiri, bahkan dengan ekstensi kecil saya yang dinyatakan digabungkan dengannya.

Jadi pertanyaannya tetap, apakah ada sesuatu yang saya sebagai pengembang aplikasi bertanggung jawab untuk lakukan (dengan anggapan ini adalah banyak hal yang perlu diperhatikan) atau apakah itu hanya masalah / bug Apple sendiri?

FWIW, pesan kendala ini tidak terjadi ketika mensimulasikan model iPad yang lebih baru, seperti iPad Pro 12.9 inci (generasi ke-3). Tetapi pesan itu muncul ketika mensimulasikan iPad Pro 9,7 inci ". Semua mengklaim mereka menjalankan iOS 12.1.


1

Saya mendapatkan kesalahan yang sama, tetapi hanya pada tampilan tertentu, ketika saya menyentuh bidang teks pertama, dan kemudian bidang teks berikutnya ke bawah.

Saya menulis di SwiftUI untuk iOS 13.4

 Unable to simultaneously satisfy constraints.
        Probably at least one of the constraints in the following list is one you don't want. 
        Try this: 
            (1) look at each constraint and try to figure out which you don't expect; 
            (2) find the code that added the unwanted constraint or constraints and fix it. 
    (
        "<NSLayoutConstraint:0x2809b6760 'assistantHeight' TUISystemInputAssistantView:0x105710da0.height == 44   (active)>",
        "<NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>",
        "<NSLayoutConstraint:0x2809cccd0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x105710da0]   (active, names: '|':UIInputSetHostView:0x105215010 )>",
        "<NSLayoutConstraint:0x2809ca300 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x10525ae10]   (active, names: '|':UIInputSetHostView:0x105215010 )>"
    )

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

0

Saya juga mendapatkan masalah yang sama dengan melanggar batasan dalam log, untuk viewCircle di xib. Saya hampir mencoba semua yang tercantum di atas dan tidak ada yang berhasil untuk saya. Kemudian saya mencoba untuk mengubah prioritas batasan Tinggi yang melanggar di log (dikonfirmasi dengan menambahkan pengidentifikasi untuk kendala pada xib) masukkan deskripsi gambar di sini


-1

Satu hal yang harus diperhatikan (setidaknya ini membuat saya tersandung) adalah bahwa saya menghilangkan kendala dari pandangan yang salah. Batasan yang saya coba hapus bukanlah kendala anak pada pandangan saya, jadi ketika saya melakukannya

myView.removeConstraint(theConstraint)

sebenarnya tidak menghapus apa pun karena saya perlu menelepon

myView.superView.removeConstraint(theConstraint)

karena kendala itu secara teknis saudara kandung kendala pandangan saya.


-4

cepat 4

Saya hanya menambahkan baris ini di viewDidLoad dan bekerja dengan baik dengan saya.

view.removeConstraints(view.constraints)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.