1

У меня есть небольшое изображение, которое перемещается по экрану с помощью UIPanGestureRecognizer, но когда он выходит из краев супервизора, он не получает больше касаний и, следовательно, больше не может вернуться назад. Как я могу предотвратить появление изображения с краев супервизора? Это код:Использование UIPanGestureRecognizer

- (void)pan:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
if (inLongPress) { 
    UIView *hitView = [gestureRecognizer view]; 

    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 

    if (!(CGRectContainsRect(self.imageView.frame, hitView.frame))) { 

     [UIView beginAnimations:@"" context:NULL]; 
     [hitView setCenter:CGPointMake(_prevCenter.x, _prevCenter.y)]; 
     [UIView commitAnimations]; 

    } 
    _prevCenter=hitView.center; 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 
     CGPoint translation = [gestureRecognizer translationInView:[hitView superview]]; 

     [hitView setCenter:CGPointMake([hitView center].x + translation.x, [hitView center].y + translation.y)]; 

     [gestureRecognizer setTranslation:CGPointZero inView:[hitView superview]]; 
    } 

    if ([gestureRecognizer state] == UIGestureRecognizerStateEnded){ 
     inLongPress=NO; 
     hitView.alpha=1.0; 
    } 
} 

}

ответ

2

просто использовать пару if, которые ограничивают CGPoint до допустимого диапазона.

Что-то, как это делает уверен, что вы не можете переместить объект за пределами зрения:

CGFloat proposedX = location.x; 
CGFloat proposedY = location.y; 

CGRect objectFrame = hitView.frame; 
CGFloat allowedXMin = 0 + objectFrame.size.width/2.0f; 
CGFloat allowedXMax = self.view.bounds.size.width - objectFrame.size.width/2.0f; 
CGFloat allowedYMin = 0 + objectFrame.size.height/2.0f; 
CGFloat allowedYMax = self.view.bounds.size.height - objectFrame.size.height/2.0f; 

if (proposedX < allowedXMin) { 
    proposedX = allowedXMin; 
} 
else if (proposedX > allowedXMax) { 
    proposedX = allowedXMax; 
} 

if (proposedY < allowedYMin) { 
    proposedY = allowedYMin; 
} 
else if (proposedY > allowedYMax) { 
    proposedY = allowedYMax; 
} 
location = CGPointMake(proposedX, proposedY); 

hitView.center = location; 
+0

большое спасибо, это работает! –

2

В вашем методе viewDidLoad вашего контроллера вида, просто установите clipsToBounds свойство вашего надтаблицы в YES.

[superview setClipsToBounds:YES];

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