2013-08-20 2 views
11

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

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

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

ответ

4

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

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

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

Большое спасибо за ваш ответ. Я попробовал это, но он все еще приближается к неправильной точке. Я пробовал рисовать это и на бумаге, но логика ускользает от меня. – glenstorey

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

Спасибо за ваш ответ. Из-за iOS7 (я думаю) я изменил строку CGAffineTransform на 'CATransform3D scaleTransform3D = CATransform3DMakeScale (scaleFactorX, scaleFactorY, 1.0);' (view.layer.transform должен был быть CATransform3D). Теперь происходит переключение вида, так что «pointToScaleTo» находится в центре (что не идеально - в идеале я хотел бы приближаться к точке, а не прыгать, а затем увеличивать), а затем вращаться на -90º. Я не уверен, откуда я получаю поворот. Вы знаете, как заставить его приближаться к точке, а не прыгать, а затем увеличивать масштаб? – glenstorey

+0

Вы можете преобразовать аффинное преобразование в 'CATransform3D', используя' self.view.layer.transform = CATransform3DMakeAffineTransform (scaleTransform); '. – Dennis

Смежные вопросы