UIscrollview和拖放

问题描述:

我创建了一种网格视图,您可以在其中添加一些小部件,并按需要通过拖放来重新排列它们。 现在我的网格视图是一个UIscroll视图,这些控件是UIview的子类。UIscrollview和拖放

以下是您可以使用的网格的示例 当我拖动窗口小部件时,如果窗口部件接近屏幕底部,我希望能够使滚动视图向下。 现在,我的小部件有一个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

这个ui集合视图的尖叫给我。由于它是uiscrollview的子类,它将具有相同的属性以及布局的附加优势。无论如何,我假设这段代码在widget类中? moveDownRect从哪里来? – 2014-09-26 08:30:27

+0

MovedownRect是widgetview中的一个常量记录,而且这段代码来自widget视图。我没有使用collectionview,因为所有的小部件可能没有相同的大小,也可以调整自己的大小。 – Loadex 2014-09-26 08:33:38

+0

您是否将滚动视图的内容大小设置为大于其框架?它是否达到了设定的内容偏移代码? – 2014-09-26 08:38:36

尝试在视图底部附近设置虚拟区域。 平移手势移动时触发。如果进入该区域,只要平移手势不离开该区域并且不结束,就开始向下滚动。

并且只要您在指定区域内,就使用计时器(NSTimer不是CADisplayLink,因为您无法在刷新视图时对视图应用滚动)来增加滚动视图的大小。