나는 사용자 정의 변수의 일부 등으로 불분명, 그래서보다는 코드를 디버깅, 나는 내가 UIPanGestureRecognizer
를 사용하여 뷰의 드래그를 할 거라고하는 방법을 보여 줄 알았는데.
따라서 (a) 제스처가 드래그되는 뷰에 추가되었다고 가정하십시오. 위에서 특정 단순함을 즐기는 동안 나는 우리가를 개선 할 수 있다고 생각,
- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
static CGRect originalFrame;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = gesture.view.frame;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
CGRect newFrame = CGRectMake(originalFrame.origin.x + translate.x,
originalFrame.origin.y + translate.y,
originalFrame.size.width,
originalFrame.size.height);
if (CGRectContainsRect(gesture.view.superview.bounds, newFrame))
gesture.view.frame = newFrame;
}
}
: 및 (b)에 해당 뷰가 당신이보기의 움직임을 제한하고자하는 수퍼 내에 포함되어, 코드처럼 보일 수 있습니다 사용자 경험. 특히 위의 코드는 사용자가 슈퍼 뷰 외부로보기를 드래그하면 (예 : 왼쪽 테두리를지나 드래그하여 손가락을 위아래로 움직여도 화면이 정지해도 매우 우아하지는 않음) 아무 것도하지 않습니다. 다음은 좀 더 우아한 사용자 인터페이스입니다 (코드를 읽는 데 좀 더 복잡합니다). 사용자가 손가락을 드래그 할 때 수퍼 뷰에서 가장 가까운 지점으로 객체를 드래그하여 사용자의 손가락은이다.
- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
static CGRect originalFrame;
if (gesture.state == UIGestureRecognizerStateBegan)
{
originalFrame = gesture.view.frame;
}
else if (gesture.state == UIGestureRecognizerStateChanged)
{
CGPoint translate = [gesture translationInView:gesture.view.superview];
CGRect newFrame = CGRectMake(fmin(gesture.view.superview.frame.size.width - originalFrame.size.width, fmax(originalFrame.origin.x + translate.x, 0.0)),
fmin(gesture.view.superview.frame.size.height - originalFrame.size.height, fmax(originalFrame.origin.y + translate.y, 0.0)),
originalFrame.size.width,
originalFrame.size.height);
gesture.view.frame = newFrame;
}
}
출처
2012-12-23 18:36:36
Rob
나는'등 frameY','frameHeight','frameOrigin'을 인식하지 못하는 실제 코드이 단지 속기 (예 :'frame.origin.y','frame.size.height' ,'frame.origin' 등). 그러나 저는 리바이의 직감에 동의합니다. 그것은 불평등이 뒤로 향하는 것입니다. 또한'translation.y'를'frame.origin.y'에 반복해서 추가하는 것을 발견했습니다. 뷰의 원래 '출처'를 사용합니다 (매번 번역을 재설정하지 않는 한, 미쳐하지 않은 관행). 마지막으로'frame.origin.x'가'self.view.bounds.size.width'의 _x_를 갖도록 설정하고 있습니다. 화면에서 꺼내겠습니까? NSLog가 보이니? – Rob