그래서 뷰에서 가져온 이미지를 이동/비율 조정할 수있는 간단한 iPhone 앱을 만들고 있습니다. 이 작업을 수행하기 위해 @paulsolt의 코드와 함께 UIGestureRecognizers를 사용하고 있습니다. 그것은 위대한 작품. 내가 겪고있는 유일한 문제는 화면을 건드리지 않았거나 잠시 동안 다른 작업을 수행 한 후에 객체를 이동하려고 할 때 발생합니다. 부드럽게 움직이기 전에 약간의 딸꾹질이 있습니다.UIPanGestureRecognizer는 이미지가 약간 유휴 상태 일 때 움직이기 전에 걸릴 수 있습니다.
누구든지이 문제를 해결하는 방법을 알고 있습니까? 이 [panGesture setMaximumNumberOfTouches:2];
을하기 때문에
- (void)addGestureRecognizersToView:(UIView *)theView {
theView.userInteractionEnabled = YES; // Enable user interaction
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[panGesture setMaximumNumberOfTouches:2];
[panGesture setDelegate:self];
[theView addGestureRecognizer:panGesture];
[panGesture release];
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
[theView addGestureRecognizer:pinchGesture];
[pinchGesture release];
}
- (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 = 1.5;
const CGFloat kMinScale = 1.0;
const CGFloat kSpeed = 0.75;
CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]) * (kSpeed);
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
}
}
- (void)handlePanGesture:(UIPanGestureRecognizer *)gestureRecognizer {
UIView *myView = [gestureRecognizer view];
CGPoint translate = [gestureRecognizer translationInView:[myView superview]];
if ([gestureRecognizer state] == UIGestureRecognizerStateChanged || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
[myView setCenter:CGPointMake(myView.center.x + translate.x, myView.center.y + translate.y)];
[gestureRecognizer setTranslation:CGPointZero inView:[myView superview]];
}
}
@danielle님께 감사드립니다. 실제로 최대 접촉 수를 1로 설정했지만 여전히 동일한 동작을 보입니다. –