J'essaie de comprendre cela depuis la semaine dernière sans aller plus loin. Ok, j'ai donc besoin d'appliquer certaines contraintes par programme dans Swift à l' UIView
utilisation de ce code:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Mais Xcode renvoie cette sortie étrange:
2014-10-03 09:48:12.657 Test[35088:2454916] 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:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] 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:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Pouvez-vous m'aider? Merci beaucoup
ios
swift
uiview
autolayout
nslayoutconstraint
Sara Canducci
la source
la source
>
. Je l'ai réparé pour vous cette fois.Réponses:
Prévoyez-vous d'avoir un carré
UIView
de largeur: 100 et de hauteur: 100 centré à l'intérieurUIView
d'unUIViewController
? Si c'est le cas, vous pouvez essayer l'un des 6 styles de disposition automatique suivants (Swift 5 / iOS 12.2):1. Utilisation de l'
NSLayoutConstraint
initialiseur2. Utilisation du langage de format visuel
3. Utilisation d'un mélange d'
NSLayoutConstraint
initialiseur et de langage de format visuel4. Utilisation
UIView.AutoresizingMask
Remarque: les ressorts et les entretoises seront convertis en contraintes de disposition automatique correspondantes lors de l'exécution.
5. Utilisation
NSLayoutAnchor
6. Utilisation
intrinsicContentSize
etNSLayoutAnchor
Résultat:
la source
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
partie! Cela m'a pris du temps à voir.Cela m'aide à apprendre visuellement, c'est donc une réponse supplémentaire.
Code de la chaudière
Chacun des exemples suivants est indépendant des autres.
Épingler le bord gauche
myView.leading = leadingMargin + 20
Méthode 1: style d'ancrage
leadingAnchor
, il y a aussitrailingAnchor
,topAnchor
etbottomAnchor
.Méthode 2: style NSLayoutConstraint
.leading
il y a aussi.trailing
,.top
et.bottom
..leadingMargin
il y a aussi.trailingMargin
,.topMargin
et.bottomMargin
.Définir la largeur et la hauteur
width = 200
height = 100
Méthode 1: style d'ancrage
Méthode 2: style NSLayoutConstraint
Centrer dans le conteneur
myView.centerX = centerX
myView.centerY = centerY
Méthode 1: style d'ancrage
Méthode 2: style NSLayoutConstraint
Remarques
NSLayoutConstraint
style, mais il n'est disponible qu'à partir d'iOS 9, donc si vous prenez en charge iOS 8, vous devez toujours utiliser leNSLayoutConstraint
style.myView
dans mon projet de test, j'avais besoin d'avoir quatre contraintes.Lectures complémentaires
la source
leading
vs.centerX
doit être spécifiée.addConstraint()
surview
afin de faire inscrire les layoutconstraints.Si vous souhaitez remplir votre super vue, je suggère la méthode rapide:
Sinon, si vous avez besoin de contraintes non égales, consultez NSLayoutAnchor à partir d'iOS 9. Il est souvent beaucoup plus facile de lire qu'en utilisant directement NSLayoutConstraint:
la source
isActive = true
n'est pas toujours une bonne idée. Il est préférable et plus performant de regrouper les contraintes associées en une seule et de les activer toutes à la fois en utilisantNSLayoutConstraint.activate
.Contraintes pour plusieurs vues dans la cour de récréation.
rapide 3+
la source
Le problème, comme le suggère le message d'erreur, est que vous avez des contraintes de type
NSAutoresizingMaskLayoutConstraints
qui entrent en conflit avec vos contraintes explicites, carnew_view.translatesAutoresizingMaskIntoConstraints
est définie sur true.Il s'agit du paramètre par défaut pour les vues que vous créez dans le code. Vous pouvez le désactiver comme ceci:
De plus, vos contraintes de largeur et de hauteur sont étranges. Si vous voulez que la vue ait une largeur constante, voici la bonne façon:
(Remplacez 100 par la largeur souhaitée.)
Si votre cible de déploiement est iOS 9.0 ou version ultérieure, vous pouvez utiliser ce code plus court:
Quoi qu'il en soit, pour une disposition comme celle-ci (taille fixe et centrée dans la vue parent), il serait plus simple d'utiliser le masque de redimensionnement automatique et de laisser le système traduire le masque en contraintes:
Notez que l'utilisation du redimensionnement automatique est parfaitement légitime même lorsque vous utilisez également la mise en page automatique. (UIKit utilise toujours le redimensionnement automatique à de nombreux endroits en interne.) Le problème est qu'il est difficile d'appliquer des contraintes supplémentaires à une vue qui utilise le redimensionnement automatique.
la source
Fondamentalement, cela impliquait 3 étapes
Cela place l'étiquette "bonjour le monde" au centre de l'écran.
Veuillez vous référer par programme aux contraintes de mise en page automatique
la source
Mis à jour pour Swift 3
Type de contraintes
la source
La mise en page automatique est réalisée en appliquant des contraintes sur les images. Utilisez NSLayoutConstraint. Il est possible de mettre en œuvre un design idéal et beau sur tous les appareils. Veuillez essayer le code ci-dessous.
la source
c'est un peu différent dans xcode 7.3.1. c'est ce que je trouve
la source
Je voudrais ajouter un concept théorique à la réponse d'Imanou Petit, afin que l'on puisse comprendre comment fonctionne la mise en page automatique.
Pour comprendre la disposition automatique, considérez votre vue comme un objet en caoutchouc qui est initialement rétréci.
Pour placer un objet à l'écran, nous avons besoin de 4 choses obligatoires:
Coordonnée X de l'objet (position horizontale).
Coordonnée Y de l'objet (position verticale)
Largeur de l'objet
Hauteur de l'objet.
1 Coordonnée X: Il existe plusieurs façons de donner des coordonnées x à une vue.
Tels que Contrainte de début, Contrainte de fin, Centre horizontal, etc.
2 Coordonnée Y: Il existe plusieurs façons de donner des coordonnées Y à une vue:
Telles que la contrainte supérieure, la contrainte inférieure, le centre vertical, etc.
3 Largeur de l'objet: Il existe deux façons de limiter la largeur d'une vue:
une. Ajoutez une contrainte de largeur fixe (considérez cette contrainte comme une tige de fer de largeur fixe et vous avez accroché horizontalement l'objet de votre caoutchouc pour que l'objet en caoutchouc ne rétrécisse pas ou ne se dilate pas)
b. N'ajoutez aucune contrainte de largeur mais ajoutez une contrainte de coordonnée x à la fin et à la fin de la vue, ces deux contraintes développeront / rétréciront l'objet de votre caoutchouc en le tirant / en le poussant des deux extrémités, avant et arrière.
4 Hauteur de l'objet: similaire à la largeur, il existe également deux façons de limiter la hauteur d'une vue:
une. Ajoutez une contrainte de hauteur fixe (considérez ces contraintes comme une tige de fer de hauteur fixe et vous avez accroché verticalement l'objet de votre caoutchouc pour que l'objet en caoutchouc ne rétrécisse pas ou ne se dilate pas)
b. N'ajoutez aucune contrainte de hauteur, mais ajoutez une contrainte de coordonnée x à la fin de la vue en haut et en bas, ces deux contraintes augmenteront / rétréciront l'objet de votre caoutchouc en le tirant / le poussant des deux extrémités, en haut et en bas.
la source
la source
C'est une façon d'ajouter des contraintes par programme
la source
Vous ajoutez toutes les contraintes définies
self.view
qui sont incorrectes, car des contraintes de largeur et de hauteur doivent être ajoutées à votrenewView
.De plus, si je comprends bien, vous souhaitez définir une largeur et une hauteur constantes de 100: 100. Dans ce cas, vous devez changer votre code pour:
la source
Si vous trouvez que ce qui précède est moche. Vous devriez envisager d'utiliser un DSL pour les contraintes. Tels que SnapKit Rend l'API de contrainte beaucoup plus conviviale
la source
Nous pouvons facilement le faire avec swift 5.1
configuration 1
sous-vue largeur hauteur définie à l'aide du flotteur
configuration 2
largeur de sous-vue définie à l'aide de la hauteur de largeur de vue
la source
Essayez cette
UIView
extension élégante pour les contraintes. Vous pouvez faire des contraintes facilement comme:Voici l'extension, copiez-la simplement dans votre projet.
la source