iOS – Positionnez UIView au centre de la vue d'set à l'aide de la mise en forme automatique par programmation

Comment programmer un UIView au centre de sa vue d'set en utilisant Auto Layout?

UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [viewObj setTranslatesAutoresizingMaskIntoConstraints:NO]; [viewObj setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:viewObj]; NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteCenterX relatedBy:NSLayoutRelationEqual toItem:self.view atsortingbute:NSLayoutAtsortingbuteCenterX multiplier:1.0 constant:0]; [self.view addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteCenterY relatedBy:NSLayoutRelationEqual toItem:self.view atsortingbute:NSLayoutAtsortingbuteCenterY multiplier:1.0 constant:0]; [self.view addConstraint:cn]; 

Le code ci-dessus fonctionne pour UIButton, mais j'ai du mal à replace la première ligne par quelque chose qui fonctionne pour un UIView.

J'ai essayé

 UIView* viewObj = [UIView alloc] initWithFrame:CGRectZero]; 

mais la vue n'apparaît pas dans le simulateur.

Aucune suggestion?

Merci!

Puisque vous avez posé cette question dans le context d'Auto Layout, le problème ici est qu'un UIButton a une taille insortingnsèque (communiquée par la méthode insortingnsicContentSize) qui fournit des informations sur la largeur et la hauteur, mais pas UIView normalement. Vous devez donc append plus de contraintes liées à la largeur et la hauteur.

Si vous voulez que votre UIView soit une taille d'set (disons, 200×200), vous pouvez append ces lignes:

 cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteHeight relatedBy:NSLayoutRelationEqual toItem:nil atsortingbute:NSLayoutAtsortingbuteNotAnAtsortingbute multiplier:1 constant:200]; [viewObj addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteWidth relatedBy:NSLayoutRelationEqual toItem:nil atsortingbute:NSLayoutAtsortingbuteNotAnAtsortingbute multiplier:1 constant:200]; [viewObj addConstraint: cn]; 

Notez que l'argument toItem: est nil et le second atsortingbut est NSLayoutAtsortingbuteNotAnAtsortingbute , car vous ne spécifiez pas la largeur et la hauteur par rapport à quoi que ce soit d'autre. Si vous voulez que la hauteur et la largeur de la sous-vue soient relatives à la super-vue (disons 0.5), vous pouvez faire ceci:

 cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteHeight relatedBy:NSLayoutRelationEqual toItem:self.view atsortingbute:NSLayoutAtsortingbuteHeight multiplier:0.5 constant:0]; [self.view addConstraint:cn]; cn = [NSLayoutConstraint constraintWithItem:viewObj atsortingbute:NSLayoutAtsortingbuteWidth relatedBy:NSLayoutRelationEqual toItem:self.view atsortingbute:NSLayoutAtsortingbuteWidth multiplier:0.5 constant:0]; [self.view addConstraint: cn]; 

UIButton , UIImageView , UIlabel et UITextField peuvent définir automatiquement leur taille en fonction de leurs propriétés de contenu. La largeur et la hauteur d'un UIImageView sont définies par l' UIImage qu'il peut contenir. La taille d'un UILabel dépendra de son text. La largeur et la hauteur d'un UIButton sont définies par le titre et l'image qu'il contient (vous pouvez en apprendre plus à ce sujet avec Insortingnsic Content Size ).

Par conséquent, lorsque vous souhaitez centrer un UIButton , un UILabel , un UITextField ou un UIImageView dans un UIView avec une layout automatique, dans la plupart des cas, vous n'avez pas besoin de créer de contraintes pour leur largeur et leur hauteur. Vous avez simplement besoin de définir des contraintes horizontales et verticales pour eux.

Cependant, avec la layout automatique, un UIView qui n'a pas de sous-vues ne peut pas countr sur quoi que ce soit pour définir sa taille sauf si vous lui fournissez des contraintes de largeur et de hauteur arbitraires. Et selon vos besoins, vous pouvez résoudre ceci de 3 manières différentes.


Le style de layout automatique pure

Ici, nous définissons la largeur et la hauteur de notre UIView directement en tant que contraintes de disposition automatique:

 override func viewDidLoad() { super.viewDidLoad() let newView = UIView() newView.backgroundColor = .redColor() newView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(newView) // Auto layout code using anchors (iOS9+) let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor) let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor) let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100) let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100) NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) } 

Le style de masque autoresizing

Ici, nous initialisons notre UIView avec sa largeur et sa hauteur, UIView son centre et son centre de superview égaux et créons des masques autorésisants. Ensuite, nous demandons à UIKit de traduire ces masques autoresizing en contraintes de layout automatique:

 override func viewDidLoad() { super.viewDidLoad() let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0)) newView.backgroundColor = .redColor() newView.center = CGPointMake(view.bounds.midX, view.bounds.midY) newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin] newView.translatesAutoresizingMaskIntoConstraints = true // default is true view.addSubview(newView) } 

Le style de la sous-class

Ici, nous créons une sous-class de UIView et surchargons sa méthode insortingnsicContentSize() ( déclaration ) afin qu'elle renvoie la taille désirée:

 import UIKit class CustomView: UIView { override func insortingnsicContentSize() -> CGSize { return CGSize(width: 100, height: 100) } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let newView = CustomView() newView.backgroundColor = .redColor() newView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(newView) let horizontalConstraint = NSLayoutConstraint(item: newView, atsortingbute: .CenterX, relatedBy: .Equal, toItem: view, atsortingbute: .CenterX, multiplier: 1, constant: 0) view.addConstraint(horizontalConstraint) let verticalConstraint = NSLayoutConstraint(item: newView, atsortingbute: .CenterY, relatedBy: .Equal, toItem: view, atsortingbute: .CenterY, multiplier: 1, constant: 0) view.addConstraint(verticalConstraint) } }