2013-08-20 8 views
11

CGAffineScale을 사용하여 뷰를 지정된 점으로 변형하는 방법을 찾으려면 많은 시간을 소비했습니다. 변환 전후의보기 및 포괄적 인 인터넷 검색 나는 이것이 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

두 단계가 있습니다. 먼저 확대 할보기를 확대합니다. 그런 다음보고 싶은 부분이보기의 중간에 오도록이 날카로운보기의 중심을 설정합니다.

당신은 종이에이를 끌어해야하며 공식은 따를 것이다 : (안된)

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

아핀 변환을'self.view.layer.transform = CATransform3DMakeAffineTransform (scaleTransform); '을 사용하여'CATransform3D'로 변환 할 수 있습니다. – Dennis