web-gelistirme-sc.com

Aynı anda kısıtlamaları yerine getirememek, kısıtlamayı kırarak kurtarmaya çalışacaktır

Aşağıda hata ayıklama alanında aldığım hata mesajı var. İyi çalışıyor ve bu hatayı almam dışında hiçbir şey yanlış değil. Bu Apple'ın uygulamayı kabul etmesini engeller mi? Nasıl düzeltebilirim?

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.
125
Johnny Cox

Hata ayıklamayı ve hangi kısıtlamanın "istemediğiniz olanı" olduğunu bulmanızı tavsiye ederim. Aşağıdaki sorunun olduğunu varsayalım:

enter image description here

Her zaman sorun aşağıdaki Kısıtlamaları ve Görünümleri nasıl bulacağınızdır.

Bunun nasıl yapılacağı hakkında iki çözüm var:

  1. DEBUG VIEW HIERARCHY(Bu yolu önermeyin)

Beklenmeyen sınırlamaları nerede bulacağınızı bildiğinizden (PBOUserWorkDayHeaderView) bunu oldukça iyi yapmanın bir yolu vardır. Kırmızı dikdörtgenlerde UIView ve NSLayoutConstraint öğelerini bulalım. Onların bellekte id olduğunu bildiğimizden bu oldukça kolaydır.

  • Debug View Hierarchy} _ uygulamasını kullanarak uygulamayı durdurun:

enter image description here

  • Uygun UIView'ı bulun:

enter image description here

  • Bir sonraki önemsediğimiz NSLayoutConstraint'i bulmak:

enter image description here

Gördüğünüz gibi, bellek işaretçileri aynı. Yani şimdi neler olduğunu biliyoruz. Ek olarak, NSLayoutConstraint görünümünde hiyerarşiyi bulabilirsiniz. Görünüm'de seçildiğinden, Gezgin'de de seçilmiştir.

enter image description here

Gerekirse, adres işaretçisini kullanarak konsolda da yazdırabilirsiniz:

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

Hata ayıklayıcının size göstereceği her kısıtlama için aynısını yapabilirsiniz :-) Şimdi bununla ne yapacağınıza karar verirsiniz. 

  1. PRET IT BETTER(Bu şekilde gerçekten tavsiye ederim, bu Xcode 7’dir)

    • görünümünüzdeki her kısıtlama için benzersiz tanımlayıcı ayarlayın:

 enter image description here

  • NSLayoutConstraint için basit bir uzantı oluşturun:

Swift

extension NSLayoutConstraint {

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

AMAÇ-C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

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

@end
  • bir kez daha oluşturun ve şimdi sizin için daha fazla okunabilir çıktıya sahipsiniz:

 enter image description here

  • id'nızı aldıktan sonra Navigatör Bul:

 enter image description here

  • ve çabucak bulun:

 enter image description here

NASIL DURUMDA SIKIŞMASI NASIL?

  • kırık kısıtlama için öncelik - 999 değiştirmeyi deneyin.
237

Karşılaştığınız sorun NSAutoresizingMaskLayoutConstraints orada olmamalıdır. Bu eski yay ve dikmeler sistemidir. Ondan kurtulmak için, bu yöntemi kısıtlamak istediğiniz her görünümde çalıştırın:

[view setTranslatesAutoresizingMaskIntoConstraints:NO];
102
David Wong

Dikkatli olun, aynı yönde ve türde birden fazla kısıtlama kullanmadığınızdan.

Örneğin: İzleme için dikey kısıtlama = 15 ve diğeri> = 10'dur.

Bazen, Xcode oluşturur farketmediğiniz bazı kısıtlamalar. Yapmanız gereken gereksiz kısıtlamalardan kurtulmanız ve günlük uyarısı kesinlikle kaybolacaktır.

enter image description here

Ek olarak, okuyabilir ve algılayabilir bazı kesin nedenler, doğrudan kayıt defterinden:

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

UILabel kısıtında problem olarak okuyabiliriz, 15pt uzunluğunda dikey kısıtlamaya öncülük eder.

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

Bu, yatay kısıtlama vb. İzini sürecektir.

28
pedrouan

Bu istisnaların çoğuna atılmıştım, bunları çözmenin en kolay ve hızlı yolu, daha sonra storyboard kaynak kodunda aradığım istisnalar içinde benzersiz değerler bulmaktı. Bu, soruna neden olan gerçek görünümleri ve kısıtlamaları bulmamda bana yardımcı oldu (tüm görünümlerde anlamlı userLabels kullanıyorum, bu da kısıtlamaları ve görünümleri izlemeyi çok kolaylaştırıyor).

Bu yüzden, yukarıdaki istisnaları kullanarak, storyboard'u xcode'da (ya da başka bir editörde) "kaynak kod" olarak açar ve bulabileceğim bir şey arardım ...

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

.. Bu, (17) değeri olan bir UILabel'deki dikey (V) kısıtlamaya benziyor.

Ben de bulduğum istisnalar dışında 

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

UILabel (0x72bf7c0), bazı dikey boşluklarla (8) bir UIButton'a (0x886efe0) yakındır.

Umarım bu, storyboard kaynak kodunda (muhtemelen başlangıçta "17" yazısını arayarak) veya en azından birkaç adayı bularak belirli görüşleri bulmam için yeterli olacaktır. Oradan, bunların hangisinin storyboard'da olduğunu ve problemin tanımlanmasını daha kolay hale getirecek olan durumların ne olduğunu çözebilmeliyim (boyut kısıtlamaları ile çakışan "çoğaltılmış" iğneleme veya iğneleme arayın) 

6
C James

Bu sorunu yaşadım, çünkü .xib dosyalarım autolayout kullanıyordu.

Dosya denetçisinde, ilk sekme. "Autolayout Kullan" seçeneğinin işaretini kaldırmak sorunu çözdü.

autolayout file inspector

6

Hangi hataların bu hataya neden olduğunu bulmakta zorlandım. İşte bunu yapmanın daha basit bir yolu. 

Xcode 6.1.1 kullanıyorum

  1. Tüm UILabels, UIImages vb. Seçmek için "Command + A" 
  2. Denetlemek için Editör -> Pin> (Seç ...) seçeneğini tıklayın.
  3. editör -> Otomatik Mizanpaj Sorunlarını Çöz -> Eksik Kısıtlar Ekle veya Önerilen Kısıtlamalara Sıfırla seçeneğini tıklayın. Davanıza bağlı.
6
Ronaldoh1

İşte benim deneyim ve çözümüm .

  1. Görünümü seçin (UILabel, UIImage etc)
  2. Editör> Pin>> Gözetlemek için (Seç ...)
  3. Editör> Otomatik Mizanpaj Sorunlarını Çözme> Eksik Kısıtlamalar Ekleme
4
royemi

swift bu kodu kullanın

view.translatesAutoresizingMaskIntoConstraints = false
4
Arun Kumar P

Her arama sorgusundan SO sorularını ve cevaplarını takip ettim. Fakat hepsi spesifik olanla ilişkili.

Temelde, bir format yazmadan önce (basit bir format olabilir) size bir uyarı verecektir.

İOS 8.0'dan varsayılan görünümler boyut sınıflarıdır. Boyut sınıflarını devre dışı bıraksanız bile, bazı otomatik düzen kısıtlamaları içerecektir.

Öyleyse, VFL kullanarak kod kullanarak kısıtlamalar koymayı planlıyorsanız. Öyleyse, aşağıdaki çizgiye dikkat edin.

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

SO'da çok arama yaptım, ancak çözüm Apple Örnek Kodu içinde yatıyordu. 

Bu nedenle, yeni bir tane eklemeyi planlamadan önce varsayılan kısıtlamaları kaldırmanız gerekir.

2
Kampai

Benim için bu sorunun asıl nedeni AutoLayout editöründe Xib seçeneğinin işaretini kaldırmayı unuttuğumdu .. __ Aslında, XIB kodunda birçok ayar yaptım.

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

Bu, soruna neden olan görüşü yakalamama yardımcı oldu.

1
Grant Carlisle

Yukarıdaki cevapların hiçbiri benim durumumda yardımcı değil. XCode 10.1 kullanıyorum ve uygulamamı simülatörde "iPad (5. nesil)" için test ediyorum. Simülatör iOS 12.1 kullanıyor.

Film şeridimde iki UITextField alt görünümü olan basit bir kök görünümü var. Film şeridinde hiç bir kısıtlama kullanılmamaktadır. Ve uygulamada veya film şeridinde UIButtonBarView nesnesi yok.

Uygulama başlatılıp kök görünümün gösterilmesi sırasında hiçbir mesaj yazdırılmaz. Simüle edilen cihaz döndürüldüğünde yok.

Ancak simülatörde, metin alanlarından birine tıkladığım an, klavye uzantısı ekranın alt kısmından kaynaklanıyor, ancak simülatörde hiç görünmüyor gibi görünen klavyenin tamamı değil. Ancak terminalde aşağıdakiler yazdırılır:

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.

Tüm bunların benim uygulamamdaki hiçbir şeyle ilgisi olmadığı ve Apple'ın kendi klavye görünümünü nasıl oluşturduğu ile ilgili her şey olduğu anlaşılıyor.

Öyleyse soru hala devam ediyor: Bir uygulama geliştiricisi olarak yapmaktan sorumlu olduğum bir şey var mı (bu varsayım üzerine, dikkat edilmesi gereken bir sürü şey var) ya da sadece Apple'ın sorunu mu?

FWIW, bu kısıtlama sorunu mesajı, iPad Pro 12.9-inç (3. nesil) gibi daha yeni bir iPad modelini simüle ederken ortaya çıkmaz. Ancak iPad Pro 9.7-inç simüle edilirken mesaj gösteriliyor ". İOS 12.1 kullandıkları iddia ediliyor.

0
jsbox

Swift 4

Ben sadece bu satırı viewDidLoad'a ekliyorum ve benimle iyi çalışıyorum.

view.removeConstraints(view.constraints)
0
Faris