2017-02-16 3 views
1

아이폰 OS 10.2 스위프트 3.0제한 UIPinchGestureRecognizer 줌 레벨 스위프트 3.0

에 목표 C. SO 포스터로 수정 된 코드!

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer { 

if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
// Reset the last scale, necessary if there are multiple objects with different scales 
lastScale = [gestureRecognizer scale]; 
} 

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
[gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

CGFloat currentScale = [[[gestureRecognizer view].layer  valueForKeyPath:@"transform.scale"] floatValue]; 

// Constants to adjust the max/min values of zoom 
const CGFloat kMaxScale = 2.0; 
const CGFloat kMinScale = 1.0; 

CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]); // new  scale is in the range (0-1) 
newScale = MIN(newScale, kMaxScale/currentScale); 
newScale = MAX(newScale, kMinScale/currentScale); 
CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale); 
[gestureRecognizer view].transform = transform; 

lastScale = [gestureRecognizer scale]; // Store the previous scale factor  for the next pinch gesture call 
} 
} 

http://paulsolt.com/blog/2011/03/limiting-uipinchgesturerecognizer-zoom-levels

샘플 코드는 거의 다하지만, 스위프트 3.0 여기에 사용되는 CATransform 키에 대한 참조를 찾을 수 없습니다. 일반적으로 그들은 동일한 보장은 없습니다 말하기 때문에 내 코드 ...

if sender.state == .began { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = sender.scale 
    } 

    if sender.state == .began || sender.state == .changed { 

     // UPDATED 
     currentScaleX = self.image2P.transform.scaleX 
     currentScaleY = self.image2P.transform.scaleY 


     self.image2P.transform = self.image2P.transform.scaledBy(x: 1.1, y: 1.1) 


     // Constants to adjust the max/min values of zoom 
     let kMaxScale:CGFloat = 2.0; 
     let kMinScale:CGFloat = 1.0; 

     var newScale = 1 - (lastScale - sender.scale) // new scale is in the range (0-1) 
     newScale = min(newScale, kMaxScale/currentScaleX) 
     newScale = max(newScale, kMinScale/currentScaleY) 
     self.image2P.transform = self.image2P.transform.scaledBy(x: newScale, y: newScale) 

     lastScale = sender.scale // Store the previous scale factor for the next pinch gesture call 
    } 
+0

은'value()'대신'self.image2P.layer.transform.scale'을 사용합니다. –

+0

슬프게도 Sachin이 존재하지 않는 것 같습니다 :) – user3069232

+0

사용할 수없는 것. –

답변

1

는 별도로 xScaleyScale을 저장해야합니다.

view.transform = CGAffineTransform(scaleX: 1.5, y: 1.2).rotated(by: .pi/3.0).translatedBy(x: 50, y: 30) 
print("scaleX = \(view.transform.scaleX), scaleY = \(view.transform.scaleY)") 

출력 :

scaleX가 = 1.5보기는 경우에도 반환 정확한 축척 비율을 작동

extension CGAffineTransform { 
    var scaleX: CGFloat { 
     return (a > 0 ? 1 : -1) * sqrt (a*a + c*c) 
    } 

    var scaleY: CGFloat { 
     return (d > 0 ? 1 : -1) * sqrt (b*b + d*d) 
    } 
} 

이 확장 방법은 및/또는 번역 회전 , scaleY = 1.2

분명하지는 않지만 a, b, cd 속성은 transform 행렬의 요소입니다. Quartz 2D Programming Guide에서 자세한 내용을 확인할 수 있습니다. 또한 수학 세부 사항 here을 찾을 수 있습니다. 이 두 소스에서 bc 요소 이름이 바뀌 었음을 유의하십시오.

+0

감사합니다. 내 확장 기능을 사용하고 내 코드를 업데이트했습니다. – user3069232