2014-09-26 3 views
2

나는 내부에 위젯을 추가 할 수있는 드래그 앤 드롭 방식으로 원하는대로 위젯을 추가 할 수있는 일종의 그리드보기를 만들고 있습니다. 현재 그리드보기는 UIscroll보기이고 위젯은 UIview의 하위 클래스입니다.UIscrollview and drag and drop

다음은 그 격자의 예입니다. 위젯을 드래그하면 위젯이 화면 아래쪽에 있으면 스크롤보기를 내려갈 수 있기를 원합니다. 지금은 내 위젯은 UIPanGestureRecognizer 다음과 같은 코드가 있습니다

func enterDragMode(recognizer:UIPanGestureRecognizer) { 

    if (recognizer.state == UIGestureRecognizerState.Ended) || (recognizer.state == UIGestureRecognizerState.Cancelled) { 
     gridNotificationCenter.postNotificationName("WidgetDragEnded", object: self) 
     // Notify the grid and drop the widget here 
    } else { 
     var translation = recognizer.translationInView(self.superview!) 
     var newPoint = self.center 
     newPoint.x += translation.x 
     newPoint.y += translation.y 

     if (CGRectContainsRect(moveDownRect, self.frame)) { 
      var scrollview = self.superview as? UIScrollView 
      if (scrollview != nil) { 
       // need to find correct visible rect here 
       res!.scrollRectToVisible(visibleRect, animated: true) 
      } 
     } 
     recognizer.setTranslation(CGPointZero, inView: self.superview) 
    } 
} 

을하지만 단순히 잡고있을 때 내가 콜백이 트리거되지 않기 때문에 제대로이 문제를 해결할 수있는 권리 클래스를 사용하지 않는 같은 느낌 보기 및 그것을 이동하지. 더 좋은 방법이 있습니까?

+0

나에게이 컬렉션 컬렉션의 비명 소리. uiscrollview의 하위 클래스이기 때문에 동일한 속성을 가지며 레이아웃이 추가되었습니다. 어쨌든이 코드는 위젯 클래스에 있다고 가정합니까? moveDownRect의 출처는 어디입니까? –

+0

move downRect는 widgetview 내부의 상수 rec이며,이 코드는 위젯 뷰에서 가져온 것입니다. 모든 위젯이 크기를 조정할 수 없기 때문에 collectionview를 사용하지 않았습니다. – Loadex

+0

그리고 스크롤보기의 콘텐츠 크기를 프레임보다 크게 설정하고 있습니까? 그것은 세트 콘텐츠 오프셋 코드를 치는 건가요? –

답변

2

보기 하단에 가상 영역을 설정하십시오. 팬 제스처가 이동하면 트리거됩니다. 영역으로 들어가면 팬 제스처가 영역을 떠나지 않고 끝나지 않는 한 스크롤을 시작합니다.

그리고 지정된 영역에있는 동안 스크롤 뷰의 크기를 늘리려면 타이머를 사용하십시오 (뷰를 새로 고치는 동안 스크롤을 적용 할 수 없기 때문에 CADisplayLink가 아닌 NSTimer).