Decir que tengo un proyecto en el que se ve como el siguiente:

UIView cambios animados con auto restricciones de diseño

Hay dos UIViews – una llamada yellowBox y la otra se llama redBox. El auto restricciones de diseño dictan que el yellowBox es de 60 puntos de la parte superior de la superview con 350 puntos de los espacios iniciales y finales (es decir, a la izquierda y a la derecha de la vista). El redBox tiene el mismo principio y el final de las limitaciones de espacio. Hay un espacio vertical de restricción entre los dos cuadros de 0 para indicar que la parte inferior de la yellowBox siempre debe ser directamente en la parte superior de la redBox.

Cuando el usuario pulsa el Expanda el Cuadro Amarillo botón, me gustaría que la altura de la yellowBox a aumentar y, como resultado, la redBox se mueve hacia abajo para continuar satisfaciendo el espacio vertical de la restricción (que la yellowBox es siempre en la parte superior de la redBox). Aquí está el código de animación:

- (IBAction)expandYellowBox:(id)sender {

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect newFrame = self.yellowBox.frame;
                         newFrame.size.height += 50;
                         self.yellowBox.frame = newFrame;
                     }];

}

Sin embargo, he sido incapaz de obtener esta funcionando correctamente. Como se puede ver el icono rojo, hay un problema con las limitaciones que en el momento:

UIView cambios animados con auto restricciones de diseño

que es bastante justo, ya que no hay manera para el diseño automático para saber la altura de las cajas. Sin embargo, no sé cómo resolver este problema de tal manera que permitirá que las cajas que deben cambiar de tamaño y mover. Por ejemplo, si especifica una altura de restricción en la yellowBox, a continuación, que impedirá que se cambia de tamaño. Si me puse a la altura de la restricción para ser mayor o igual (para permitir que el yellowBox altura para aumentar) luego me sale un error de restricción diferentes:

UIView cambios animados con auto restricciones de diseño

Todas las restricciones han sido establecidas mediante Xcode en el guión gráfico, que ninguno ha sido escrito en código.

Cualquier ayuda muy apreciada.


EDICIÓN: Como resulta, el yellowBox es creciente cuando se pulsa el botón – es sólo que no podía decir porque aparece detrás de la redBox. Sólo me di cuenta después de hacer clic en alrededor de cuatro veces y comenzó a aparecer la parte de abajo de la redBox. Sin embargo, la misma pregunta sigue siendo cómo obtener la redBox siempre se adhieren a la parte inferior de la yellowBox.

  • u puede comprobar si viewDidLayoutSubViews método llamado en ur viewController? Cuando se realice el evento click.
  • No, el viewDidLayoutSubViews método no es llamado.
  • intenta establecer el límite en lugar de marco puede trabajar algún tiempo. incluso repetir el auto.yellowBox.frame = newFrame; dos veces en u código también puede corregir algunas veces
  • Que no parece funcionar, además de la repetición de código varias veces (hasta que se tome) no parece ser la mejor solución para el problema…
  • compruebe mi respuesta y demostración. esto ayudará a
InformationsquelleAutor Skoota | 2014-01-09

3 Comentarios

  1. 82

    Probar como se ha mencionado por shwet-solanki, pero agregue la siguiente línea después de cambiar la restricción:

    [self.view layoutIfNeeded];

    la IBAction aspecto:

    - (IBAction)expandYellowBox:(id)sender {
    
    [UIView animateWithDuration:0.5
                     animations:^{
                         self.yellowBoxHeightConstraint.constant += 50;
                         [self.view layoutIfNeeded];
                     }];
    }

    Donde yellowBoxHeightConstraint es el IBOutlet para la altura de la restricción de yellowBox.
    Espero que esto ayude.

    • Gracias por la sugerencia, pero este es el método exacto que yo estoy tratando de evitar. Yo no quiero tener que ajustar manualmente el marco de la redBox, ya que debe mover en virtud de las restricciones. Es trivial en este caso, pero en el ejemplo de esta pregunta es sólo un proyecto de prueba para demostrar el problema – el problema real se produce en un proyecto mucho mayor que al usar el enfoque que le han sugerido sería lamentablemente no ser viable o sostenible.
    • Espero que te han notado que he editado mi respuesta. El actual método de trabajo. Hacer que probarlo.
    • También he publicado una pregunta de seguimiento: stackoverflow.com/questions/21033146/…
    • Muchas gracias! Trabajó aquí! 🙂
    • Usted me hizo romper una entrevista.. Gracias.. !!
    • Tenga cuidado con layoutIfNeeded, ya que se realiza un diseño de inmediato y que pueden causar efectos no deseados en algunas circunstancias (como cuando se usa desde el scrollView:didScroll para atar animación para el desplazamiento de un punto de vista, lo que desencadena una gran cantidad de eventos). También es muy exigente. En esos casos, es mejor utilizar setNeedsLayout, que el diseño de las cosas, pero cuando el subproceso de interfaz de usuario tiene tiempo.
    • gracias por el puntero @ncerezo. Me han llegado a través de este tipo de situaciones en vivo proyectos y setNeedsLayout de hecho se recomienda en ese caso.
    • …yo estaba llamando layoutIfNeeded en mi UIImageView en lugar de ver

  2. 4
    1. Aumentar la Altura de las restricciones tanto a los puntos de vista
    2. Crear un IBOutlet para la altura de la restricción de yellowbox
    3. Ahora en lugar de cambiar la altura de yellowbox en el evento de pulsación de botón, en lugar de cambiar el valor de la altura de la restricción. yo.e imagine que su IBOutlet nombre de la restricción es yellowBoxHeightConstraint, entonces yellowBoxHeightConstraint.constant += 50;

    Espero que esto funcione para usted.

    • Gracias, que hace expandir el yellowBox (con la redBox anclados a la parte inferior de la yellowBox), pero no se animan al cambio ocurre de repente.
  3. 1
    //
    // WPViewController.h
    // AutoLayoutTEst
    //
    // Created by VASANTH K on 09/01/14.
    // 
    //
    
    #import <UIKit/UIKit.h>
    
    @interface WPViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UIButton *button1;
    - (IBAction)buttClicked:(id)sender;
    @property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstrain;
    
    @property (strong, nonatomic) IBOutlet UIButton *button2;
    @end

    Evento click

    - (IBAction)buttClicked:(id)sender {
    
    
        self.heightConstrain.constant=100;
    
    
    }

    aquí la necesidad de u para establecer el heightConstrain para el botón Amarillo y, a continuación, crear referencia de corriente para el botón, a continuación, actualizar el heightConstrain para actualizar el tamaño del botón se moverá automáticamente a su botón Rojo de abajo.

    https://github.com/vasanth3008/AutoLayoutHeighDemo

    se refieren a mi ejemplo de demostración del proyecto

Dejar respuesta

Please enter your comment!
Please enter your name here