Impossible de satisfaire simultanément les contraintes lors de l'animation

J'ai six contraintes d'user installées avec IB qui ressemblent à ceci:

H:|-(593)-[UIView(411)]-(20)-| V:|-(20)-[UIView(288)]-(396)-| 

Je développe et réduit la vue en changeant les contraintes, puis en appelant layoutIfNeeded. Par exemple, pour développer la vue, je vais faire:

 H:|-(20)-[UIView(984)]-(20)-| V:|-(20)-[UIView(663)]-(20)-| 

Et puis appelez

 [UIView animateWithDuration:.5 animations:^{ [self.view layoutIfNeeded]; }]; 

Cette technique se développe et rétrécit ma vue, et ça a l'air sympa, mais je reçois un avertissement assez confus:

 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) ( "<NSLayoutConstraint:0x148d5af0 H:[UIView:0x148d4e50(411)]>", "<NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]>", "<NSLayoutConstraint:0x148ce040 H:|-(NSSpace(20))-[UITableView:0xacd4e00] (Names: '|':UIView:0x148cddd0 )>", "<NSLayoutConstraint:0x148cdf00 H:[UITableView:0xace7600]-(NSSpace(20))-| (Names: '|':UIView:0x148cddd0 )>", "<NSLayoutConstraint:0x148cdea0 H:[UITableView:0xacd4e00]-(NSSpace(8))-[UITableView:0xace7600]>", "<NSLayoutConstraint:0x148d4c10 UIView:0x148cddd0.trailing == UIView:0x148cdd40.trailing>", "<NSLayoutConstraint:0x148d4b90 H:|-(0)-[UIView:0x148cddd0] (Names: '|':UIView:0x148cdd40 )>", "<NSLayoutConstraint:0x148d6020 H:|-(320)-[UIView:0x148cdd40] (Names: '|':UIView:0x148cd330 )>", "<NSLayoutConstraint:0x148d5fa0 UIView:0x148cdd40.trailing == UIView:0x148cd330.trailing>", "<NSLayoutConstraint:0x148d5f60 H:[UIView:0x148d4e50]-(NSSpace(20))-| (Names: '|':UIView:0x148cd330 )>", "<NSLayoutConstraint:0x148d5ee0 H:|-(20)-[UIView:0x148d4e50] (Names: '|':UIView:0x148cd330 )>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x148cc940 H:[UITableView:0xace7600(319)]> 

Maintenant, toutes ces contraintes sont générées par IB. J'ai double ^ (sortingple!) Vérifié ceci. J'ai mis ces contraintes set avec un stylo et du papier et j'ai obtenu ceci:

 UIView_A H:[-(20)-[UIView_E]-(20)-] and H:[-(320)-(UIView_B) UIView_B H:[-(0)-[UIView_D] UIView_C H:[UIView_C(411)] UIView_D H:[-(20)-[UITableView_F]-[UITableView_G(319)]-(20)-] 

Je ne comprends pas comment ces contraintes ne peuvent pas être satisfaites. Ils ont l'air bien. Je ne les change pas et ils sont générés par IB. Les contraintes générées par IB ne sont-elles pas automatiquement satisfiables?

Ou, au minimum, y a-t-il un moyen d'arrêter les avertissements? Il se comporte parfaitement et je n'ai pas besoin de voir qu'il brise une contrainte qui ne semble rien faire de toute façon.

Cette contrainte:

H: [UITableView: 0xace7600 (319)]> "

semble être un obstacle à la résolution du système.

Pouvez-vous l'enlever?

Donc, il s'avère que l'ordre dans lequel je change les contraintes est important.

Pour développer la vue, je vais

  1. Augmentez la largeur: H: | – (593) – [UIView ( 984 )] – (20) – |
  2. Diminuer l'espace de début: H: | – ( 20 ) – [UIView (984)] – (20) – |

Cela ne produit aucun avertissement. Cependant, si je fais cela dans l'ordre inverse, je recevrai un avertissement:

 Unable to simultaneously satisfy constraints. Probably at least one of the constraints ... ...Will attempt to recover by breaking constraint <NSLayoutConstraint:0x1567f650 H:[UITableView:0x119e6200(319)]> 

En rétrécissant la vue, j'ai copié le code qui a augmenté la largeur (avec le même ordre) et juste changé les valeurs. Cela m'a donné l'avertissement que j'ai posté dans ma question initiale. Quand j'ai changé l'ordre de rétrécissement, les avertissements ont disparu.


pourquoi est-ce le cas? Je ne sais pas. Je vais mettre à jour comme je découvre plus.

J'ai reçu le même message, et j'ai finalement compris pourquoi ça arrive,
Ma solution est: Ne laissez aucun object FLIP OVER à n'importe quel moment de l'animation.

En d'autres termes, les contraintes doivent être OUTside de n'importe quel object, mais parfois les contraintes sont à l'intérieur pendant l'animation, pas comme notre attente.

En d'autres termes, ne laissez pas la marge supérieure envahir la marge inférieure en raison de l'animation de contrainte.

Par exemple,

  top constraint: topA = initially 100 [Box A] bottom constraint: botA = initially 150 

maintenant, si vous définissez comme ci-dessous et animer,

  topA = 300 botA = 25 

alors une erreur devrait se produire, pourquoi: le thread envahit la marge inférieure AVANT que la marge inférieure ne descende. Donc, vous préférez changer l'ORDRE,

  botA = 25 topA = 300 

L'erreur disparaîtra alors parce que la contrainte du bas préserverait la hauteur de la masse et que la prochaine contrainte supérieure réduirait la hauteur de l'object sans envahir la marge inférieure.

* Point: Laisser l'object avoir une largeur et une hauteur supérieures à 0 CONTINUELLEMENT même pendant l'animation, sans être interrompu par les contraintes.

J'espère que je t'ai aidé.