Me he pasado un montón de tiempo tratando de encontrar una manera de utilizar CGAffineScale para transformar una vista a un punto dado, incluyendo cachondeo con puntos de anclaje, moviendo el centro de una vista antes y después de la transformación y la integral de Googlear. Soy consciente de que esto sería mucho más sencillo con un UIScrollview; pero yo sé que es técnicamente posible sin que uno de ellos, y se ha convertido en una astilla en mi mente.

Esta respuesta se pone muy cerca de lo que quiero lograr, pero la única respuesta que da detalles sobre cómo acercar a una esquina (en lugar de un punto dado) por inteligentemente mover el centro a la esquina opuesta de la que desea acercar.

¿Cómo puedo modificar mvds‘ código de a escala de un UIView a cualquier punto dado en un UIView?

CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
    self.view.transform = tr;
    self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];

OriginalEl autor glenstorey | 2013-08-20

2 Comentarios

  1. 6

    Hay 2 pasos: en Primer lugar, la escala de la vista que desea acercar. A continuación, se establece el centro de este volado vista de que la parte que desea ver termina en el medio de la vista.

    Debe dibujar esto, sobre el papel, y las fórmulas siguientes: (a verificar)

    CGFloat s = 3;
    CGPoint p = CGPointMake(100, 200);
    CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
    CGFloat h = self.view.frame.size.height;
    CGFloat w = self.view.frame.size.width;
    [UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
        self.view.transform = tr;
        CGFloat cx = w/2-s*(p.x-w/2);
        CGFloat cy = h/2-s*(p.y-h/2);
        self.view.center = CGPointMake(cx, cy); //was: (w*s/2,h-h*s/2);
    } completion:^(BOOL finished) {}];
    Muchas gracias por tu respuesta. Me hizo probar este, pero todavía se amplía la incorrecta punto. He tratado de dibujar esto en papel, pero la lógica me escapa.

    OriginalEl autor mvds

  2. 3

    De hecho, me encontré con este mismo problema yo mismo. Para solucionarlo, todo lo que hice fue cambiar el punto de anclaje de la vista se me fue escalado porque CGAffineTransforms se realizan en el punto de vista en relación a su punto de anclaje, por lo que dependiendo de donde el punto de anclaje es, la transformación de la escala, traducir, o girar la vista de manera diferente. Aquí es la idea básica:

    CGPoint pointToScaleTo = CGPointMake(x, y); //Just enter the coordinates you 
                                                //want to scale your view towards
    
    CGFloat viewWidth = self.view.bounds.size.width;
    CGFloat viewHeight = self.view.bounds.size.height;
    
    CGFloat scaleFactorX = ...;
    CGFloat scaleFactorY = ...;
    
    CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleFactorX, scaleFactorY);
    
    [UIView animateWithDuration:2.5f delay:0.0f options:0 animations:^{
    
        //I divide the x and y coordinates by the view width and height
        //because the anchor point coordinates are normalized to the range
        //0.0-1.0.
        self.view.layer.anchorPoint = CGPointMake(pointToScaleTo.x/viewWidth, pointToScaleTo.y/viewHeight);
    
        //Now that the anchor point has been changed, apply the scale transform
        self.view.layer.transform = scaleTransform;
    
    } completion:^(BOOL finished) {}];
    Gracias por tu respuesta. Debido a iOS7 (creo) he cambiado el CGAffineTransform línea para CATransform3D scaleTransform3D = CATransform3DMakeScale(scaleFactorX, scaleFactorY, 1.0); (ver.la capa.transformar tuvo que ser CATransform3D). Lo que sucede ahora es el punto de vista de los saltos, de manera que el pointToScaleTo está en el centro (que no es lo ideal – idealmente me gustaría zoom hacia el punto en lugar de saltar a, entonces zoom in) y, a continuación, gira-90º. No estoy seguro de que voy por la rotación de. ¿Sabes cómo llegar a zoom hasta el punto en lugar de saltar y luego zoom?
    Usted puede convertir la transformación afín en un CATransform3D utilizando self.view.layer.transform = CATransform3DMakeAffineTransform(scaleTransform);.

    OriginalEl autor pasawaya

Dejar respuesta

Please enter your comment!
Please enter your name here