Проверка границ для центра UIView при перетаскивании его - PullRequest
1 голос
/ 10 марта 2011

У меня есть UIView элементы, которые я хочу перетащить по экрану. Но я хочу, чтобы, несмотря ни на что, их центр всегда был в границах их супервизии. Я добавил к ним UIPanGestureRecognizer и сделал проверку границ следующим образом:

-(void) dragInProgress : (UIPanGestureRecognizer *) recognizer
{
    if ([self.delegate hallElement:self shouldMove:recognizer])
    {
        CGPoint translation = [recognizer translationInView:self.view.superview];

        CGPoint currentCenter = self.view.center;

        CGFloat maxX = self.view.superview.bounds.size.width;
        if (currentCenter.x + translation.x < 0 )
        {
            translation.x =  (0 - currentCenter.x);
        }
        if (currentCenter.x + translation.x >= maxX ) 
        {  
            translation.x = (maxX - currentCenter.x - 1);
        }

        CGFloat maxY = self.view.superview.bounds.size.height;
        if (currentCenter.y  + translation.y < 0 )    
        {  
            translation.y = (0 - currentCenter.y);
        }
        if (currentCenter.y + translation.y >= maxY ) 
        {  
            translation.y = (maxY - currentCenter.y - 1);
        }

        [recognizer setTranslation:translation inView:self.view.superview];
        CGPoint translationInViewCoordiateSystem = [recognizer translationInView:self.view];
        self.view.transform = CGAffineTransformTranslate(self.view.transform, translationInViewCoordiateSystem.x  ,  translationInViewCoordiateSystem.y  );
        [recognizer setTranslation:CGPointZero inView:self.view];
    }
}

Но эта связанная проверка не работает в лучшем случае и обычно приводит к странному поведению. Как я могу гарантировать, что центр останется в рамках суперпредставления?

Ответы [ 2 ]

0 голосов
/ 11 марта 2011

Я выяснил, в чём была проблема: трансформация трансформации не меняет центр вида, поэтому проверка границ для центра никогда не бывает эффективной, потому что центр всегда остается неизменным, даже если вид на самом деле перемещается черезscreen.

Таким образом, решение будет заключаться в замене следующих строк:

[recognizer setTranslation:translation inView:self.view.superview];
        CGPoint translationInViewCoordiateSystem = [recognizer translationInView:self.view];
        self.view.transform = CGAffineTransformTranslate(self.view.transform, translationInViewCoordiateSystem.x  ,  translationInViewCoordiateSystem.y  );
        [recognizer setTranslation:CGPointZero inView:self.view];

На:

currentCenter.x += translation.x;
currentCenter.y += translation.y;
self.view.center = currentCenter;
[recognizer setTranslation:CGPointZero inView:self.view.superview];
0 голосов
/ 10 марта 2011

Ваш центр не всегда будет находиться в пределах реальных границ - он может превышать 1 пиксель в максимальных направлениях X и Y.Не уверен, что это является причиной вашей проблемы, но этот код должен решить эту проблему:

CGPoint translation = [recognizer translationInView:self.view.superview];
CGPoint currentCenter = self.view.center;

CGFloat maxX = self.view.superview.bounds.size.width;
if (currentCenter.x + translation.x < 0 )
{
    translation.x =  (0 - currentCenter.x);
}

if (currentCenter.x + translation.x >= maxX ) // A CHANGE HERE
{  
    translation.x = (maxX - currentCenter.x - 1);  // A CHANGE HERE
}

CGFloat maxY = self.view.superview.bounds.size.height;
if (currentCenter.y  + translation.y < 0 )    
{  
    translation.y = (0 - currentCenter.y);
}

if (currentCenter.y + translation.y >= maxY ) // A CHANGE HERE
{  
    translation.y = (maxY - currentCenter.y - 1); // A CHANGE HERE
}
...