Cómo escalar (acercar) una vista UIV a un determinado punto CGPoint

He invertido mucho time tratando de encontrar una manera de usar CGAffineScale para transformar una vista en un punto determinado, incluyendo jugar con puntos de anclaje, mover el centro de una vista antes y después de la transformación y búsqueda completa de Google. Estoy consciente de que esto sería mucho más simple con un UIScrollview; pero sé que técnicamente es posible hacerlo sin uno, y se ha convertido en una astilla en mi mente.

Esta respuesta se acerca notablemente a lo que quiero lograr, pero la respuesta solo proporciona detalles sobre cómo hacer un acercamiento a una esquina determinada (en lugar de un punto determinado) al mover hábilmente el centro a la esquina opuesta a la que desea ampliar .

¿Cómo puedo modificar el código de mvds para escalar una UIView a cualquier punto dado en una 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(ww*s/2,h*s/2); } completion:^(BOOL finished) {}]; 

Hay dos pasos involucrados: primero escala la vista a la que desea acercar. Luego, establece el centro de esta vista ampliada para que la parte que desea ver termine en el medio de la vista.

Debe dibujar esto en papel y las fórmulas seguirán: (no probado)

 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*(px-w/2); CGFloat cy = h/2-s*(py-h/2); self.view.center = CGPointMake(cx, cy); //was: (w*s/2,hh*s/2); } completion:^(BOOL finished) {}]; 

De hecho, me encontré con este mismo problema. Para solucionarlo, todo lo que hice fue cambiar el punto de anclaje de la vista que estaba escalando porque CGAffineTransforms se realizan en la vista en relación con su punto de anclaje, por lo que dependiendo de dónde esté el punto de anclaje, la transformación se escalará, traducirá o rotará la vista de manera diferente Aquí está 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) {}];