Подтвердить что ты не робот

Как масштабировать (масштабировать) UIView для данного CGPoint

Я потратил много времени, пытаясь найти способ использовать CGAffineScale, чтобы преобразовать представление в определенную точку, в том числе возиться с опорными точками, перемещая центр представления до и после преобразования и всеобъемлющего Googling. Я знаю, что это было бы намного проще с UIScrollview; но я знаю, что это технически возможно обойтись без одного, и это становится осколком в моем сознании.

Этот ответ значительно приближается к тому, что я хочу достичь, но в ответе приводятся только подробные сведения о том, как увеличить масштаб до заданного угла (вместо заданной точки) умело перемещая центр в угол, противоположный тому, который вы хотите увеличить.

Как я могу изменить mvds 'код, чтобы масштабировать UIView до любой точки 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) {}];
4b9b3361

Ответ 1

Есть два шага: сначала вы увеличиваете масштаб, на который хотите увеличить масштаб. Затем вы устанавливаете центр этого взорванного вида таким образом, чтобы часть, которую вы хотите увидеть, попадала в середину представления.

Вы должны нарисовать это на бумаге, и формулы будут следовать: (untested)

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) {}];

Ответ 2

Я сам столкнулся с этой самой проблемой. Чтобы исправить это, все, что я сделал, было изменить точку привязки зрения я масштабирование, потому что CGAffineTransforms выполняются на представлении в связи с его точкой привязки, поэтому в зависимости от того, где точка анкера, преобразование будет масштабировать, переводить, или вращать вид по-разному. Вот основная идея:

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) {}];