cocoa autolayout xcode6 nstextfield nslayoutconstraint

cocoa - NSTextField y AutoLayout: altura de crecimiento automático-> programáticamente



xcode6 nslayoutconstraint (1)

Si creo una etiqueta en el constructor de interfaz y establezco una cadena a través de un código que no se ajusta a su tamaño actual, la etiqueta crecerá verticalmente para adaptarse a su tamaño, ¡genial !. Además de la restricción x y y, Xcode crea un NSContentSizeLayoutConstraint que contiene abrazo y resistencia a la compresión.

Aquí hay una salida de registro de la restricción

<NSContentSizeLayoutConstraint:0x6080000a11a0 V:[NSTextField:0x600000180c30(17)] Hug:750 CompressionResistance:750>

La pregunta es, ¿cómo hacer esto programáticamente? No he encontrado una manera todavía. No hay forma de crear un NSContentSizeLayoutConstraint y la configuración del contenidoCompressionResistance del NSTextField no parece tener ningún efecto.

Aquí está mi código:

self.label = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 0, 100, 20)]; [self.label setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.label setBordered:YES]; [[self.label cell] setLineBreakMode:NSLineBreakByWordWrapping]; [self.window.contentView addSubview:self.label]; self.label.stringValue = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; NSDictionary *dict = @{@"label" : self.label}; [self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]"options:0 metrics:nil views:dict]]; [self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]" options:0 metrics:nil views:dict]]; NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:40]; constraint.priority = 1; [self.label addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:self.label attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:18]; constraint.priority = 1; [self.label addConstraint:constraint]; [self.label setContentCompressionResistancePriority:1000 forOrientation:NSLayoutConstraintOrientationHorizontal]; [self.label setContentCompressionResistancePriority:1000 forOrientation:NSLayoutConstraintOrientationVertical];


Establezca elMaxLayoutWidth preferredMaxLayoutWidth del campo de texto. Creo que entonces no quieres o no necesitas la restricción explícita de ancho.

En mi prueba, me parece que esto funciona:

self.label = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 100, 18)]; self.label.translatesAutoresizingMaskIntoConstraints = NO; [self.label.cell setLineBreakMode:NSLineBreakByWordWrapping]; self.label.stringValue = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; self.label.preferredMaxLayoutWidth = 100; self.label.editable = NO; [self.window.contentView addSubview:self.label]; NSDictionary* views = @{ @"label" : self.label }; [self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]" options:0 metrics:nil views:views]]; [self.label.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]" options:0 metrics:nil views:views]];

Básicamente, la principal diferencia con la tuya es que configuro editable a NO . También dejo fuera las restricciones de ancho y altura y establezco la resistencia a la compresión.