2011-03-10 3 views
1

나는 화면 주위로 드래그하고자하는 요소가 UIView입니다. 하지만 나는 그들의 중심이 항상 그들의 superview의 경계 안에 있어야한다는 것을 무엇이든 상관없이 원한다. 나는 UIPanGestureRecognizer와 나는 다음과 같이 경계가 확인하고 그들에게 추가 :경계를 드래그하면서 UIView의 중앙을 확인합니다.

-(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]; 
    } 
} 

그러나이 바운드 검사가 최상의 경우에 작동하지 않는 경우, 일반적으로 이상한 행동을 초래한다. 센터가 수퍼 뷰 범위 내에 머물도록하려면 어떻게해야합니까?

+0

는 "이상한 행동을"제발 정의합니다. 당신은 당신이보고 싶은 것을 말했지만, 당신은 무엇을보고 있습니까? 당신의 논리는 나에게 좋아 보인다. – occulus

+0

게시 한 코드 뒤에 오는 것은 무엇입니까? 게시 된 코드는 어떤 맥락에서 존재합니까? 어떤 방법입니까? – occulus

+0

@ coculus : 이상한 행동은 때로는 바운더리 검사만으로 화면의 중심에 있지만 가장자리에 가깝지는 않지만 특정 방향으로보기를 움직일 수 있다는 것입니다. 이 코드는 UIPanGestureRecognizer의 처리기 안에 있습니다. 메서드의 끝에, 모든 계산이 완료된 후 계산 된 변환으로 내 뷰의 변환을 변환 한 다음 변환을 다시 0으로 다시 설정합니다. –

답변

0

: 가 번역 뷰의 중심을 변경하지 않는 변환, 그래서 경계가 검사 그 문제를 야기하지만이 코드는 그 경계의 문제를 해결해야하는지 확실하지 않음 보기가 화면을 가로 질러 실제로 이동하더라도 센터는 항상 똑같이 유지되므로 센터는 결코 효율적이지 않습니다.

그래서 솔루션은 다음과 같은 라인을 대체하는 것입니다 :

[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

센터가 항상 실제 범위 내에 있지는 않습니다. 최대 X 및 Y 방향으로 1 픽셀 씩 넘어갈 수 있습니다. 나는 문제가 무엇인지 파악

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 
} 
+0

머리를 주셔서 감사합니다,하지만 이것은 아직 문제를 해결하지 못하고 있습니다 ... –

관련 문제