¿Qué es setTranslatesAutoresizingMaskIntoConstraints: NO para?

En algún proyecto que trato de comprender hay algún código:

[[[self foregroundContentView] contentView] addSubview:[self hueLabel]]; [[[self foregroundContentView] contentView] addSubview:[self hueSlider]]; [[[self foregroundContentView] contentView] addSubview:[self saturationLabel]]; [[[self foregroundContentView] contentView] addSubview:[self saturationSlider]]; [[[self foregroundContentView] contentView] addSubview:[self brightnessLabel]]; [[[self foregroundContentView] contentView] addSubview:[self brightnessSlider]]; [[[self foregroundContentView] contentView] addSubview:[self saveButton]]; [[self foregroundContentScrollView] addSubview:[self foregroundContentView]]; [[self foregroundContentScrollView] addSubview:[self imageView]]; [[self view] addSubview:[self backgroundView]]; [[self view] addSubview:[self foregroundContentScrollView]]; 

Cada vista tiene una propiedad setTranslatesAutoresizingMaskIntoConstraints establecida en NO , por ejemplo:

 [[self saveButton] setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Luego agrega algunas restricciones a estas vistas:

  NSDictionary* views = @{ @"backgroundView" : [self backgroundView], @"foregroundContentScrollView" : [self foregroundContentScrollView], @"foregroundContentView" : [self foregroundContentView], @"hueLabel" : [self hueLabel], @"hueSlider" : [self hueSlider], @"saturationLabel" : [self saturationLabel], @"saturationSlider" : [self saturationSlider], @"brightnessLabel" : [self brightnessLabel], @"brightnessSlider" : [self brightnessSlider], @"saveButton" : [self saveButton], @"imageView" : [self imageView] }; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[backgroundView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[backgroundView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[foregroundContentView]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[hueLabel]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[hueSlider]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saturationLabel]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saturationSlider]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[brightnessLabel]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[brightnessSlider]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saveButton]-|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView(==foregroundContentScrollView)]|" options:0 metrics:nil views:views]]; [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=30)-[hueLabel]-[hueSlider]-[saturationLabel]-[saturationSlider]-[brightnessLabel]-[brightnessSlider]-[saveButton]-(>=10)-[imageView(==200)]|" options:0 metrics:nil views:views]]; 

Las preguntas son:

  • ¿Qué es setTranslatesAutoresizingMaskIntoConstraints:NO para? ¿Por qué cuando elimino uno de línea con ese método, entonces todo está roto?
  • ¿Qué hace esa línea?

     [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 

El layout automático es una característica relativamente reciente. Eso significa que hay tres types de código:

  • Código que desconoce el layout automático. Utiliza el enfoque de los resortes y los puntales porque no sabe nada más.
  • Código que conoce la disposition automática pero opta por usar resortes y puntas, al less en algunas circunstancias.
  • Código que usa layout automático.

Esto se aplica a su código, el código de los frameworks (UIKit) y el código de bibliotecas de terceros.

Debido a la existencia del primer tipo de código, todas las vistas deben tener el antiguo comportamiento de resortes y puntales de forma pnetworkingeterminada. El código que conoce el layout automático puede desactivarlo si lo desea, pero el código que no es consciente obviamente no puede encenderlo, porque no sabe que tiene que hacerlo o qué propiedad configurarlo para hacerlo.

Debido a que el antiguo comportamiento de los resortes y los puntales entraría en conflicto con la mayoría de las forms en que se usa el layout automático, el código que usa el layout automático usualmente tiene que apagarlo. Lo hace al establecer la propiedad translatesAutoresizingMaskIntoConstraints a NO .

Esa decisión debe dejarse al código del controller que coloca la vista en cuestión en la jerarquía de la vista, porque solo ese código sabe cómo quiere organizar la vista en el layout (o, en el caso del primer tipo de código, no 't "sabe" pero usa resortes y puntales por ignorancia).

Si no logra borrar translatesAutoresizingMaskIntoConstraints en su código de controller que usa layout automático, generalmente obtendrá excepciones debido a restricciones insatisfactorias. Las excepciones se capturarán y se ignorarán en su mayoría, pero el sistema de layout automático deberá ignorar algunas de sus restricciones para completar el layout. Como consecuencia, sus puntos de vista pueden ser presentados incorrectamente.

Esta línea:

 [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 

agrega restricciones que mantienen el foregroundContentScrollView planoContentScrollView llenando su supervisión horizontal. El borde de ataque de esa vista será hecho para igualar el borde de ataque de su supervisor, y su borde posterior será hecho para igualar el borde de salida de su supervisor.

Es una forma de vistas que utilizan el layout automático para ignorar el layout de los muelles y los puntales antiguos. Ver

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AdoptingAutoLayout/AdoptingAutoLayout.html

Este enlace para una gran explicación. Si desea usar el layout automático como si lo estuviera, querrá escuchar el layout automático y no los resortes y puntales. Es por eso que está configurado en NO.