Programáticamente utilizando restricciones para centrar un UIIMageView

Estoy trabajando en un proyecto de iOS en el que necesito utilizar restricciones para mis puntos de vista mediante progtwigción. Estoy acostumbrado a los storyboards, pero estoy usando xibs para este proyecto en particular debido a la naturaleza de la especificación del proyecto.

Tengo un MainViewController , en el que creo las siguientes properties en el file .h:

 @property (nonatomic, strong) IBOutlet UIImageView *backgroundImageView; @property (nonatomic, strong) IBOutlet UIImageView *logoImage; 

Agregué estas instancias de UIImageView a mi file XIB y seleccioné las imágenes apropiadas a través del inspector de Atributos.

En mi file .m, tengo un método addConstraints , que se llama en viewDidLoad . Dentro de este método, me aseguro de desactivar la conversión de autoresizingMasks en restricciones:

 self.backgroundImageView.translatesAutoresizingMaskIntoConstraints = NO; self.logoImage.translatesAutoresizingMaskIntoConstraints = NO; 

Luego, he configurado restricciones para que la image de background ocupe la totalidad de la supervisión:

 id mainView = @{@"background": self.backgroundImageView}; //Set constraints so that the background takes up the entirety of the superview [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[background]|" options:0 metrics:nil views:mainView]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[background]|" options:0 metrics:nil views:mainView]]; 

Finalmente, establezco restricciones para que la vista del logotipo esté en el centro de la vista (que es donde me equivoco):

 // Width constraint [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]]; // Height constraint [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]]; // Center horizontally [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; // Center vertically [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; 

El error que recibo es *** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Constraint items must each be an instance of UIView or subclass' , que no entiendo completamente, como mi Los elementos de restricción (dos instancias de UIImageView ) son subclasss de UIView , pero puedo estar malentendiendo esto. ¿Alguien puede ayudar a señalar dónde me equivoco?

Trata eso :

 // Width constraint [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.backgroundImageView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]]; // Height constraint [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.backgroundImageView attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]]; // Center horizontally [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.backgroundImageView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; // Center vertically [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.logoImage attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.backgroundImageView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; 

Estabas tratando de definir restricciones entre tu UIImageView y tu controller de vista. Debe definir restricciones entre las vistas que son vistas secundarias de una misma vista.