1

У меня есть UIView, и я использую ниже код, чтобы сделать его круглым.UIGestureRecognizer на закругленном виде

[myView setBackgroundColor:[UIColor redColor]]; 
[[myView layer] setCornerRadius:[myView bounds].size.height/2.0f]; 
[[myView layer] setMasksToBounds:YES]; 
[myView setClipsToBounds:YES]; 

Затем добавить UIPanGestureRecognizer для перемещения окна

UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(boxIsMoving:)]; 
     [myView addGestureRecognizer:panGesture]; 

Но проблема в том, если пользователь крана за пределами круга, но на самом кадре и потащил мой взгляд, также начинают двигаться. Может ли кто-нибудь предложить мне, как я мог игнорировать прикосновения вне раунда.

+1

Вы пробовали рассчитать фактическое расстояние от центра вашего вида до точки, которая была затронута? Если ваш взгляд действительно является кругом, это должно выполнять эту работу, поскольку минимальное расстояние - это просто высота вашего представления. –

ответ

5

Этот метод делегата можно использовать. Он будет возвращать NO, если касание находится за пределами радиуса угла.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    CGPoint touchPoint = [touch locationInView:myView]; 
    if (CGRectContainsPoint(myview.bounds, touchPoint)) 
    { 
     CGFloat centerX = CGRectGetMidX(myView.bounds); 
     CGFloat centerY = CGRectGetMidY(myView.bounds); 
     CGFloat radius2 = pow((touchPoint.x -centerX),2)+ pow((touchPoint.y - centerY), 2); 
     if (radius2 < pow(CGRectGetWidth(myView.frame)/2, 2)) 
     { 
      return YES; 
     } 
    } 
    return NO; 
} 
0

Как Эрик Dolor предложил, вы можете просто вычислить расстояние между жестом и центральной точкой зрения. Используя что-то подобное;

- (IBAction)boxIsMoving:(UIPanGestureRecognizer *)gestureRecognizer 
{ 
    CGPoint viewCentre = CGPointMake(myView.bounds.size.width/2, myView.bounds.size.height/2); 

    CGPoint gesturePosition = [gestureRecognizer locationInView:self.view]; 

    float distanceGestureToViewCentre = abs((sqrt((viewCentre.x - gesturePosition.x) 
              * (viewCentre.x - gesturePosition.x) 
              + (viewCentre.y - gesturePosition.y) 
              * (viewCentre.y - gesturePosition.y)))); 

    if(distanceTapToViewCentre < radiusOfView) 
    { 
     // Handle pan 
    } 
    else 
    { 
     // Do nothing 
    } 
} 
+0

Ответ Уцава ниже, вероятно, лучше моего! –