Mise en page automatique des contraintes d'alerte “qui Va tenter de récupérer par la rupture de la contrainte” (possible problème logique)
Je suis à la définition de certains détails contraintes pour iPhone 4 lorsque l'application est lancée sur cet appareil. Tout regarder grand en termes d'alignement et tout et tout.
Mais, je reçois un pour tous mes contraintes qui tente de les récupérer en brisant les contraintes.
Cette méthode permet d'obtenir appeler mon viewDidLoad lorsqu'il détecte un iPhone 4
- (void) addConstraints {
//removing automatic system constraints
[self.view removeConstraints:self.view.constraints];
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *views = NSDictionaryOfVariableBindings(appBackground, myCustomer, myItemDetails, myItemQuantity, myItemPrice, myNext, myBtn); //UIImageView, UITextField, UIButton
for (UIView *view in [views allValues]) {
view.translatesAutoresizingMaskIntoConstraints = NO;
}
NSDictionary *metrics = @{@"width": @210.0, @"height": @42.0, @"verticalSpacing": @34};
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[appBackground]|"
options:0
metrics:nil
views:views];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[appBackground]|"
options:0
metrics:nil
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(85)-[myCustomer(==height)]-(verticalSpacing)-[myItemDetails(==height)]-(verticalSpacing)-[myItemQuantity(==height)]-(verticalSpacing)-[myItemPrice(==height)]-(18)-[myNext(==35)]-(71.5)-[myBtn(==50)]-(7.5)-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myCustomer(==width)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemDetails(==width)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemQuantity(==width)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[myItemPrice(==width)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-78-[myNext(==173)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-11.5-[myBtn(==54)]-|"
options:0
metrics:metrics
views:views]];
[self.view addConstraints:constraints];
}
Erreur!
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:0xb8282f0 H:|-(50)-[UITextField:0xb823fc0] (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb828320 H:[UITextField:0xb823fc0(210)]>",
"<NSLayoutConstraint:0xb82be10 H:[UITextField:0xb823fc0]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb82d3d0 H:|-(78)-[UIButton:0xb82ad50] (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb82d420 H:[UIButton:0xb82ad50(173)]>",
"<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xb82d450 H:[UIButton:0xb82ad50]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>
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.
2014-08-03 14:03:29.239 iReceipt[2886: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)
(
"<NSLayoutConstraint:0xb8282f0 H:|-(50)-[UITextField:0xb823fc0] (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb828320 H:[UITextField:0xb823fc0(210)]>",
"<NSLayoutConstraint:0xb82be10 H:[UITextField:0xb823fc0]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb82d480 H:|-(11.5)-[UIButton:0xb820120] (Names: '|':UIView:0xb82f360 )>",
"<NSLayoutConstraint:0xb82e390 H:[UIButton:0xb820120(54)]>",
"<NSLayoutConstraint:0xb82e3c0 H:[UIButton:0xb820120]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xb82e3c0 H:[UIButton:0xb820120]-(NSSpace(20))-| (Names: '|':UIView:0xb82f360 )>
S'il vous plaît laissez-moi savoir si vous les gars ont besoin de plus d'informations..
OriginalL'auteur NorthBlast | 2014-08-03
Vous devez vous connecter pour publier un commentaire.
Ces trois contraintes:
qui dictent la superview être 50 + 210 + 20 == 280 points de large.
Ces trois contraintes:
dicter la même superview être 78 + 173 + 20 == 271 points de large.
Évidemment, ceux qui peuvent pas être vrais en même temps. Vous devez décider ce que vous voulez vraiment arriver ici. Nous ne pouvons pas lire dans votre esprit et ne peut UIKit.
Habituellement, vous n'avez pas défini une largeur de contrainte sur un bouton; vous permettre d'utiliser sa taille intrinsèque avec les priorités qui s'imposent pour le contenu des câlins et la résistance à la compression. En outre, vous ne désirez pas régler dur de l'espacement de chaque côté de la touche. Soit laisser que l'espacement varie sans contrainte, de sorte que le bouton peut être sa taille intrinsèque, réduire la priorité de cette contrainte si elle est facultative, ou de faire une inégalité de sorte que vous avez un minimum d'espacement, mais pas exactement à l'espacement.
Le problème que vous avez posté est avec votre horizontale de contraintes, pas de vos contraintes verticales. Vous aurez un problème similaire à la verticale si votre superview n'est pas exactement
85+3*(height+verticalSpacing)+height+18+35+71.5+50+7.5
points de haut. Vous devez créer plus de souplesse dans vos contraintes que possible, comme Ken mentionné.Cette partie de votre code est à propos de la mise en page verticale alors que le conflit est dû à la mise en page horizontale. Le
UIButton
semble être votremyNext
compte tenu de la largeur. LeUITextField
pourrait être l'un d'eux, car ils sont contraints de la même façon. Je dois dire, cependant, que vous semble de plus en plus contraignantes en général. Je ne sais pas quelle est la relation de la superview est à l'écran, mais vous dicter tout au point. Il n'y a pas de flexibilité pour la remise des différentes tailles d'écran ou des orientations, etc.ok. mais je n'ai pas vraiment envie de donner plus de souplesse parce que je ne peux pas soutenir le mode paysage et je veux seulement les champs et les boutons ont une largeur exacte et la hauteur quand il est exécuté sur un iPhone 4 pour correspondre à ma conception de l'INTERFACE utilisateur
Alors pourquoi êtes-vous à l'aide de disposition automatique?
OriginalL'auteur Ken Thomases
Vous obligent à vos points de vue trop. Vous devez toujours laisser par exemple l'un des leftmargin, la largeur et la rightmargin flexible, et laissez-la mise en page automatique moteur stretch.
Un seul tiret sans nombre moyen de distance par défaut, qui est de 20 pixels. Donc, si vous retirez votre fuite des contraintes sur
et de les modifier à
la mise en page, le moteur de puis étirer la rightmargin de la touche pour le faire rentrer à la
contenant de vue. Il y a bien sûr d'autres moyens de relâchement de ces contraintes, tout dépend de vos objectifs de conception.
Personnellement, je n'ai jamais utiliser l'API standard:s pour la mise en page automatique plus. J'utilise la bibliothèque PureLayout, qui résumés mise en page automatique à merveille!
@"H:|-78-[myNext(==173)]"
).Ah, merci, c'était ce que je voulais dire. Je vais modifier ma réponse
OriginalL'auteur Hunkpapa