Estoy tratando de girar un UIView un par de radianes, pero después de la aplicación de la transformación no parece estar manteniendo a su tamaño. ¿Cuál es el camino correcto para lograr esto?

Aquí es lo que estoy haciendo y lo que me pasa (cuadro Azul con la flecha es el punto de Vista estoy tratando de girar — debería mantener el mismo aspecto que el de la caja roja detrás):

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

double rads = DEGREES_TO_RADIANS(240);
CGAffineTransform transform = CGAffineTransformRotate(CGAffineTransformIdentity, rads);
self.arrowView.transform = transform;

Gire UIView alrededor de su centro de mantenimiento de su tamaño

Gracias!

  • ¿Te olvides de invocar la macro? E. g. CGAffineTransform transformar = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(45));
  • Lo siento, soy de edición de la pregunta. Yo no estoy usando la macro, pero aún no funciona como debería.
  • Bien, necesita ya que el parámetro para CGAffineTransformMakeRotation está en radianes.
  • tienes razón, mi mal. Ahora no parecen estar manteniendo a su centro de la cuestión, no obstante, que todavía se cambia el tamaño después de la rotación. He actualizado el código de acuerdo en la pregunta.
InformationsquelleAutor Diego Acosta | 2014-01-26

9 Comentarios

  1. 25

    Probablemente te estás pegando un problema con el diseño Automático. Usted probablemente tiene limitaciones en la vista rotada de fijar a los bordes de la superview. Cuando la transformación se aplica, diseño Automático es la actualización de la vista del tamaño de la que todavía caben dentro de la superview.

    Usted puede experimentar con diferentes restricciones (por ejemplo, poniendo el centro de la vista, para el centro de otro punto de vista, y la fijación de la anchura y la altura a valores constantes) o gire el diseño Automático fuera de la vista rotada, o, si estos no funcionan o no se adaptan a sus necesidades, utilice un contenedor de vista que se presenta bajo el diseño Automático, y añadir su rotación de vista a este, sin el uso de Autodiseño.

    Esto sólo puede ser hecho en el código, puede hacer que las opiniones de cada uno sujeto a Autodiseño o no mediante el establecimiento de translatesAutoresizingMasksIntoConstraints a NO (Automático) o YES (apagado Automático). Usted necesitará para establecer el adecuado autoresizing máscaras si el interruptor de vista de uno a otro.

    • Gracias!. Esto es exactamente lo que yo estaba buscando. Añadir esta línea resuelto mi problema: [auto.arrowView setTranslatesAutoresizingMaskIntoconstraints:YES]; no es de ninguna manera de visualizar este o cambio de IB?
    • Con el IB, todo de diseño automático o nada de diseño automático. Me alegro de que funcionaba, que era un poco de una conjetura, pero tuve el mismo problema hace un par de días.
    • translatesAutoresizingMaskIntoConstraints no translatesAutoresizingMasksIntoConstraints
  2. 47

    Me evite el uso de macros a menos que sea necesario. Esto funciona perfectamente bien

    float degrees = 20; //the value in degrees
    view.transform = CGAffineTransformMakeRotation(degrees * M_PI/180);
    • Bonita y sencilla.
  3. 25

    Swift + extensión son tus amigos!

    //MARK: - UIView Extension -
    
    extension UIView {
    
        /**
         Rotate a view by specified degrees
    
         - parameter angle: angle in degrees
         */
        func rotate(angle angle: CGFloat) {
            let radians = angle / 180.0 * CGFloat.pi
            let rotation = CGAffineTransformRotate(self.transform, radians);
            self.transform = rotation
        }
    
    }

    De esta manera, en cualquier parte del código:

    let view = UIView(frame: CGRectMake(0, 0, 100, 100))
    view.backgroundColor = UIcolor.redColor()
    view.rotate(angle: 90)
    • Me gustaría cambiarle el nombre para ser llamado setRotation como rotate suena como que están rotando por un cierto ángulo. I. e. llamar rotate dos veces haría girar dos veces que no.
  4. 16

    Actualización de Luca Davanzo la respuesta con Swift 4:

    /**
     Rotate a view by specified degrees
    
     - parameter angle: angle in degrees
     */
    func rotate(angle: CGFloat) {
        let radians = angle / 180.0 * CGFloat.pi
        let rotation = self.transform.rotated(by: radians)
        self.transform = rotation
    }
  5. 12

    La CGAffineTransformRotate transformación de gira a partir de una transformación afín. El hecho de que usted está usando CGAffineTransformIdentity podría ser el problema. Debe especificar la transformación actual de la vista.

    #define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
    ...
    double rads = DEGREES_TO_RADIANS(240);
    CGAffineTransform transform = CGAffineTransformRotate(self.arrowView.transform, rads);
    self.arrowView.transform = transform;

    También, usted puede ser que desee considerar:

    self.arrowView.transform = CGAffineTransformMakeRotation(rads);

    EDITAR : Si puedes, comparte lo que tipo de transformación (animado/inanimado , solo/iterativo) que se desea lograr. Yo creo que no podría ser mejor, optimizar la manera de hacer esto.

  6. 6

    Probar con este código:

    #define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
    
    double rads = DEGREES_TO_RADIANS(240);
    self.arrowView.layer.transform = CATransform3DMakeRotation(rads, 0, 0, 1);
    • Estoy recibiendo exactamente el mismo resultado.
  7. 2

    De Swift, 3:

    let degrees: CGFloat = -90
    let radians = CGFloat(__sinpi(degrees.native/180.0))
    view.transform = CGAffineTransform(rotationAngle: radians)

    Estoy usando -90 porque de esta parte específica de la documentación sobre el rotationAngle usted tiene que pasar a CGAffineTransform:

    El ángulo, en radianes, por lo que este tipo de matriz se gira la coordenada
    sistema de ejes. En iOS, un valor positivo especifica en sentido antihorario
    la rotación y un valor negativo especifica rotación en sentido horario.

  8. 2

    Swift 5:

    extension UIView {
        func setTransformRotation(toDegrees angleInDegrees: CGFloat) {
            let angleInRadians = angleInDegrees / 180.0 * CGFloat.pi
            let rotation = self.transform.rotated(by: angleInRadians)
            self.transform = rotation
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here