Advertencia de vista mal colocada y comportamiento impar con la vista personalizada IB_DESIGNABLE usando layout automático

Creo una vista personalizada diseñada por IB (ver el código a continuación) que se reproduce correctamente en IB y también funciona bien cuando la ejecuto. Sin embargo, para get esta advertencia acerca de que la vista está fuera de lugar y no puedo cambiar el tamaño de la vista manualmente en Interface Builder (al tocar un identificador de cambio de tamaño, la vista saltará en su contenedor).

Obtengo el mismo comportamiento o similar para todo tipo de layouts diferentes. ¿Tienes una idea si estoy haciendo algo mal aquí o es solo un error en IB?

(PD: no puedo simplemente ignorar la advertencia)

Advertencia de vista mal colocada

EDITAR: agregado captura de pantalla de restricciones:

Restricciones

Aquí está el código (encabezado):

IB_DESIGNABLE @interface AKATestView : UIView @end 

Implementación:

 @interface AKATestView() @property(nonatomic)BOOL subviewsCreated; @property(nonatomic)BOOL subviewConstraintsCreated; @property(nonatomic)NSDictionary* views; @end @implementation AKATestView - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self setupAfterInit]; } return self; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setupAfterInit]; } return self; } - (void)setupAfterInit { [self createSubviews]; } - (void)createSubviews { if (!self.subviewsCreated) { self.translatesAutoresizingMaskIntoConstraints = NO; UILabel* labelView = [[UILabel alloc] initWithFrame:CGRectZero]; labelView.text = @"Name"; labelView.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:labelView]; UITextField* textField = [[UITextField alloc] initWithFrame:CGRectZero]; textField.borderStyle = UITextBorderStyleRoundedRect; textField.placeholder = @"Enter some text"; textField.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:textField]; UILabel* errorMessageLabel = [[UILabel alloc] initWithFrame:CGRectZero]; errorMessageLabel.text = @"Error message"; errorMessageLabel.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:errorMessageLabel]; self.views = @{ @"label": labelView, @"editor": textField, @"errorMessageLabel": errorMessageLabel }; self.subviewsCreated = YES; [self setNeedsUpdateConstraints]; } } - (void)updateConstraints { if (!self.subviewConstraintsCreated) { NSDictionary* metrics = @{ @"pt": @(4), @"pr": @(4), @"pb": @(4), @"pl": @(4), @"labelWidth": @(100), @"errorPl": @(4 + 100 + 4), @"hsLabelEditor": @(4), @"vsEditorError": @(2) }; NSArray* specs = @[ @{ @"format": @"H:|-(pl)-[label(labelWidth)]-(hsLabelEditor)-[editor]-(pr)-|", @"options": @(NSLayoutFormatAlignAllFirstBaseline) }, @{ @"format": @"V:|-(pt)-[editor]-(vsEditorError)-[errorMessageLabel]-(pb)-|", @"options": @(NSLayoutFormatAlignAllLeading|NSLayoutFormatAlignAllTrailing) } ]; for (NSDictionary* spec in specs) { NSString* format = spec[@"format"]; NSUInteger options = ((NSNumber*)spec[@"options"]).unsignedIntegerValue; NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:format options:options metrics:metrics views:self.views]; [self addConstraints:constraints]; } self.subviewConstraintsCreated = YES; } [super updateConstraints]; } @end 

Intente eliminar self.translatesAutoresizingMaskIntoConstraints = NO; en su método createSubviews . IB parece depender de esta traducción para get una medición correcta en el diseñador. Tuve el mismo problema y esto lo solucionó.

Todavía tengo que traduceAutosizingMaskIntoConstraints a NO para las subvenciones. Confirmé que no hay ninguna restricción extra generada, incluso con este set en YES . ¡Espero que sea el caso para ti también!