0

나는 이미지 기반 응용 프로그램을 만들고있어 내가 만든 UIView 내에서 회전/이동/크기 조정 된 이미지를 표시하고 싶습니다. UIGesture를 구현하는 방법에 대한 유용한 자습서를 따랐으며이를 사용하여 익숙해졌습니다. UIView 내에서 제스처를 유지할 수 있도록 좀 더 뒤에있는 코드를 이해하면됩니다.UIView 외부에서 GestureRecongnizers를 사용하여 UIImageView를 이동하는 것을 어떻게 막을 수 있습니까?

-(void)scale:(id)sender { 
NSLog(@"See a pinch gesture"); 
[self.view bringSubviewToFront:[(UIPinchGestureRecognizer*)sender view]]; 

if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

    lastScale = 1.0; 
    return; 
} 

CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]); 

CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale); 

[[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform]; 

lastScale = [(UIPinchGestureRecognizer*)sender scale]; 
} 

-(void)rotate:(id)sender { 
    NSLog(@"See a rotate gesture"); 
    [self.view bringSubviewToFront:[(UIRotationGestureRecognizer*)sender view]];  

    if([(UIRotationGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

     lastRotation = 0.0; 
     return; 
    } 

CGFloat rotation = 0.0 - (lastRotation - [(UIRotationGestureRecognizer*)sender rotation]); 

CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation); 

[[(UIRotationGestureRecognizer*)sender view] setTransform:newTransform]; 

lastRotation = [(UIRotationGestureRecognizer*)sender rotation]; 
} 

-(void)move:(id)sender { 
    NSLog(@"See a move gesture"); 
    [[(UITapGestureRecognizer*)sender view] layer];//removeAllAnimations]; 

[self.view bringSubviewToFront:[(UIPanGestureRecognizer*)sender view]]; 
CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; 

if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { 

    firstX = [[sender view] center].x; 
    firstY = [[sender view] center].y; 


} 


translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y); 

[[sender view] setCenter:translatedPoint]; 
if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { 

    CGFloat finalX = translatedPoint.x + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].x); 
    CGFloat finalY = translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y); 

    if(UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) { 

     if(finalX < 0) { 

      finalX = 0; 
     } 

     else if(finalX > 768) { 

      finalX = 768; 
     } 

     if(finalY < 0) { 

      finalY = 0; 
     } 

     else if(finalY > 1024) { 

      finalY = 1024; 
     } 
    } 

    else { 

     if(finalX < 0) { 

      finalX = 0; 
     } 

     else if(finalX > 1024) { 

      finalX = 768; 
     } 

     if(finalY < 0) { 

      finalY = 0; 
     } 

     else if(finalY > 768) { 

      finalY = 1024; 
     } 
    } 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:.35]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [[sender view] setCenter:CGPointMake(finalX, finalY)]; 
    [UIView commitAnimations]; 
} 

} 
:

UIImage *image; 
UIImageView *theImageView; 
UIView *layoutOne; 

그 아래 내 선언 제스처 Recognisers하고있다가 내가 그들의 업무를 수행하도록 얻기 위해 다음 자습서의 다른 부분입니다

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
layoutOne = [[UIView alloc] initWithFrame:CGRectMake(95.0, 107.0, 578, 682)]; 
theImageView = [[UIImageView alloc] initWithFrame:[layoutOne frame]]; 
[theImageView setImage:image]; 
theImageView.userInteractionEnabled = TRUE; 
[layoutOne addSubview:theImageView]; 
takePhoto.hidden = YES; 
theImageView.clipsToBounds = YES; 

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)]; 
[pinchRecognizer setDelegate:self]; 
[theImageView addGestureRecognizer:pinchRecognizer]; 

UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; 
[rotationRecognizer setDelegate:self]; 
[theImageView addGestureRecognizer:rotationRecognizer]; 

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
[panRecognizer setMinimumNumberOfTouches:1]; 
[panRecognizer setMaximumNumberOfTouches:1]; 
[panRecognizer setDelegate:self]; 
[theImageView addGestureRecognizer:panRecognizer]; 

UITapGestureRecognizer *deleteButton = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(delButton:)]; 
[deleteButton setNumberOfTapsRequired:2]; 
[deleteButton setDelegate:self]; 
[theImageView addGestureRecognizer:deleteButton]; 


UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
[tapRecognizer setNumberOfTapsRequired:1]; 
[tapRecognizer setDelegate:self]; 
[tapRecognizer requireGestureRecognizerToFail:deleteButton]; 
[theImageView addGestureRecognizer:tapRecognizer]; 
[self.view addSubview:theImageView]; 
} 

참고 : 여기에 코드입니다

코드 줄이 길어서 미안합니다. 제가 성취하고자하는 것을 정확히 이해하고 싶습니다. 나는 주로 -(void)move:(id)sender 내에서 계속 진행되는 수학 문제를 이해하고 싶기 때문에 UIImage/UIImageView가 내가 만든 UI 하위 뷰 (layoutOne) 외부로 이동하는 것을 막을 수 있습니다. 도움이 될 수 있다면 저에게 정말 감사 할 것입니다! 감사.

답변

2

나는 위에서 사용한 방법으로이 작업을 수행하는 방법을 알았습니다. 일단 내가해야 할 일을 알게되면 정말 쉬웠습니다. 이 방법을 혼자서 사용하는 경우, UIView 내 경우에는 내 사용을 layoutOne으로 지정해야합니다. move:에서 rotate:, scale: 메서드를 추가하려면 , else if, else 문 중 하나에 포함되어 있지 않은지 확인하십시오. layoutOne.clipsToBounds = YES;에 추가해야합니다. 이렇게하면 상호 작용하려는 이미지가 UIView 외부로 이동하지 않고 이미지 경계 부분에 닿으면 해당 부분이 나타나지 않습니다. Simples!