Establecer restricciones programáticamente

Estoy experimentando con cómo usar UIScrollView. Después de muchos problemas, finalmente pude entenderlo. Pero ahora parece que he encontrado otro obstáculo.

En esta aplicación simple, tengo una vista de desplazamiento con y para que funcione, tengo que configurar el espacio inferior de la vista para restringir la vista de desplazamiento a 0 como se describeaquí y funciona bien. Lo estoy haciendo a través del IB.

Ahora me he topado con un escenario en el que tengo que hacer esa parte programáticamente. He añadido el siguiente código en elviewDidLoad método.

NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.view
                                                                             attribute:NSLayoutAttributeBottom
                                                                             relatedBy:NSLayoutRelationEqual
                                                                                toItem:self.scrollView
                                                                             attribute:NSLayoutAttributeBottom
                                                                            multiplier:1.0
                                                                              constant:0.0];
[self.view addConstraint:bottomSpaceConstraint];

Pero no parece funcionar. Da salida al siguiente mensaje en la ventana de la consola y no sé qué hacer con él.

Incapaz de satisfacer simultáneamente las restricciones. Probablemente al menos una de las restricciones en la siguiente lista es una que no desea. Intente esto: (1) mire cada restricción e intente averiguar cuál no espera; (2) encuentre el código que agregó la restricción o restricciones no deseadas y corríjalo. (Nota: si está viendo NSAutoresizingMaskLayoutConstraints que no comprende, consulte la documentación de la propiedad UIView traduceAutoresizingMaskIntoConstraints) ("", "")

¿Alguíen puede decirme como hacer esto, por favor? También he adjuntado un proyecto de demostración.aquí para que pueda tener una mejor idea sobre el tema.

ACTUALIZAR:

En primer lugar gracias por las respuestas. Usando las formas mencionadas en las respuestas, pude hacerlo funcionar. Sin embargo, en un escenario ligeramente diferente no lo es. Ahora estoy tratando de cargar una vista en un controlador de vista programáticamente.

Si puedo explicar con más detalle. Hay 2 controladores de vista. El primero es unUITableViewController y el segundo unUIViewController. Dentro de eso unUIScrollView. También hay múltiplesUIViewsy la altura de algunas de esas vistas supera la altura normal de la pantalla.

losUITableViewController muestra una lista de opciones. Basado en la selección del usuario, un particularUIView fuera del lote se cargará en elUIViewController con elUIScrollView.

En este escenario, el método anterior no funciona. El desplazamiento no está sucediendo. ¿Tengo que hacer algo diferente ya que estoy cargando la vista por separado?

He subido un proyecto de demostraciónaquí Para que puedas verlo en acción. Por favor vea elEmail.xib y seleccioneEmail de la lista de vista de tabla.

Respuestas a la pregunta(4)

Su respuesta a la pregunta