8

Ho creato un progetto dimostrativo here. Ho una vista in cui ho creato una ScrollView in un file .xib. Nel builder dell'interfaccia non ho impostato alcun vincolo. Nel mio metodo viewDidLoad ho impostato vincoli con SnapKit:Previene Interface Builder dalla creazione automatica di vincoli?

scrollView.snp_makeConstraints { (make) -> Void in 
    make.edges.equalTo(self.view) 
} 

Quando eseguo il codice ottengo il seguente output della console:

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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430] (Names: '|':UIView:0x7b74dd10)>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7baa2760> <UIScrollView:0x7b6608d0>.top == <UIView:0x7b64d800>.top>" 
) 

Will attempt to recover by breaking constraint 
<NSIBPrototypingLayoutConstraint:0x7b74e280 'IB auto generated at build time for view with fixed frame' V:|-(1)-[UIScrollView:0x7b74c430] (Names: '|':UIView:0x7b74dd10)> 

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. 
2015-05-29 18:37:14.368 DeviceImagesTest[36462:607] 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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e080 'IB auto generated at build time for view with fixed frame' H:|-(0)-[UIScrollView:0x7b74c430](LTR) (Names: '|':UIView:0x7b74dd10)>", 
    "<NSIBPrototypingLayoutConstraint:0x7b74e330 'IB auto generated at build time for view with fixed frame' H:[UIScrollView:0x7b74c430(600)]>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7baa7170> <UIScrollView:0x7baa7b30>.right == <UIView:0x7baa79a0>.right>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4800 h=-&- v=-&- UIView:0x7b74dd10.width == UIViewControllerWrapperView:0x7ba9f060.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5180 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.width == UINavigationTransitionView:0x7bc769b0.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa58e0 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.width == UILayoutContainerView:0x7bc75140.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa61a0 h=-&- v=-&- UILayoutContainerView:0x7bc75140.width == UIWindow:0x7bc71870.width>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69a0 h=--- v=--- H:[UIWindow:0x7bc71870(320)]>" 
) 

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7baa95b0> <UIScrollView:0x7baa9610>.right == <UIView:0x7baa96b0>.right> 

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. 
2015-05-29 18:37:14.496 DeviceImagesTest[36462:607] 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) 
(
    "<NSIBPrototypingLayoutConstraint:0x7b74e360 'IB auto generated at build time for view with fixed frame' V:[UIScrollView:0x7b74c430(600)]>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7bc77e40> <UIScrollView:0x7bc7f6a0>.top == <UIView:0x7bc52180>.top>", 
    "<<DeviceImagesTest.LayoutConstraint:0x7bc49420> <UIScrollView:0x7bc74b00>.bottom == <UIView:0x7bc7b970>.bottom>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa4960 h=-&- v=-&- UIView:0x7b74dd10.height == UIViewControllerWrapperView:0x7ba9f060.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa51e0 h=-&- v=-&- UIViewControllerWrapperView:0x7ba9f060.height == UINavigationTransitionView:0x7bc769b0.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa5940 h=-&- v=-&- UINavigationTransitionView:0x7bc769b0.height == UILayoutContainerView:0x7bc75140.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa6200 h=-&- v=-&- UILayoutContainerView:0x7bc75140.height == UIWindow:0x7bc71870.height>", 
    "<NSAutoresizingMaskLayoutConstraint:0x7baa69d0 h=--- v=--- V:[UIWindow:0x7bc71870(568)]>" 
) 

Will attempt to recover by breaking constraint 
<<DeviceImagesTest.LayoutConstraint:0x7bc84790> <UIScrollView:0x7bc848b0>.bottom == <UIView:0x7bc84860>.bottom> 

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. 

Sembra che Interface Builder sta generando vincoli per me anche se ho fatto non impostato alcuno. Ciò porta ad un conflitto con i miei vincoli che ho impostato nel codice. Ho anche impostato setTranslatesAutoresizingMasks(false).

Come impedire a Generatore di interfaccia di generare automaticamente i vincoli?

+0

Se si sta impostando * vincoli * a storyboard, poi nel codice, 'scrollview.setTranslatesAutoresizingMasksIntoConstraints (falsi)' – nhgrif

+0

Io uso l'interfaccia builder non Storyboard e ho fatto '' setTranslatesAutoresizingMasks (false) '' – confile

risposta

13

Se si è confusi sui NSAutoresizingMaskLayoutConstraints in tale elenco, potrebbe essere perché non si è chiamato setTranslatesAutoresizingMasksIntoContraints(false) in quella vista. (anche se ho avuto l'impressione che SnapKit lo faccia per te).

Se si è confusi sullo NSIBPrototypingLayoutConstraint, questo è un vincolo generato automaticamente da Interface Builder. Per liberarsene, aggiungi alcuni vincoli Top, Bottom, Leading e Trailing in Interface Builder e impostali per essere rimossi al momento della compilazione. Per maggiori dettagli su questo, dare un'occhiata alla http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame/

UPDATE: url è stato cambiato a http://travisjeffery.com/b/2013/11/preventing-ib-auto-generated-at-build-time-for-view-with-fixed-frame-when-using-auto-layout/

0

Come impedire a Generatore di interfaccia di generare automaticamente dei vincoli?

Il modo più semplice: selezionare il pennino o lo storyboard nel navigatore del progetto, andare su "Impostazioni file" e deselezionare "Usa layout automatico".

+1

Ma voglio usare AutoLayout ma nel codice! – confile

+0

Vai avanti. Stiamo semplicemente girando il comportamento di autolayout nel pennino, che è esattamente quello che vuoi fare. Puoi ancora usarlo nel codice. Provalo! – matt

+0

Non funziona in questo modo. Puoi controllare il mio esempio Ho ancora gli avvertimenti. – confile