Monotouch - 滑动手势编程

时间:2011-12-09 17:48:41

标签: xamarin.ios

我正在为IPAD应用程序开发一个控件(我第一次做Apple开发)。它是一个模仿网格的简单控件 - 由一组UIViews(每个代表一个单元格)组成,全部添加到父UIView(以类似网格的方式)。

其中一个要求是实现滑动手势 - 用户在网格上滑动以激活/停用单元格 - 这对应于数据库中的1/0。

我创建了一个UISwipeGesture并将其添加到代表一个单元格的每个UIView中。这似乎是一种不正确的方法,因为它触发了UIView的事件,其中滑动起源但不是所有UIViews。

我的理解是我需要跨父UIView实现SwipeGesture,其中包含所有这些子UIView。但是,如果我这样做,我怎么知道哪个孩子UIView被刷了?还是任何其他有意义的方法?

3 个答案:

答案 0 :(得分:4)

我知道这个帖子已经很老了,但我创建了一个可能有帮助的Swipe扩展方法。

View.Swipe(UISwipeGestureRecognizerDirection.Right).Event += Swipe_Event;

void Swipe_Event(ViewExtensions.SwipeClass sender, UISwipeGestureRecognizer recognizer)
{
    View view = sender.View; // do something with view that was swiped.
}

答案 1 :(得分:2)

这可能无法解答您的问题,但我可以谈谈我在这里采用类似用例的方法:

1)我会放弃UIScrollView并使用UITableView。您会注意到UITableView继承自UIScrollView,并具有虚拟化和单元/视图重用的所有性能优势。在您努力优化应用以提高设备性能时,您会发现非常有用。

2)利用UITableViewCell的ContentView创建自定义“网格”单元格。或者更好的是,如果您不需要特别创建网格行,请使用MonoTouch.Dialog。

3)使用此awesome class(@praeclarum的道具)在MonoTouch中设置手势。您实质上提供了一个UIGestureRecognizer作为泛型参数。然后,您可以使用LocationInView方法获取手势发生的UITableView中的点

public void HandleSwipe(UISwipeGestureRecognizer recognizer)
{
    if(recognizer.State == UIGestureRecognizerState.Ended) {

        var point = recognizer.LocationInView(myTableView);
        var indexPath = myTableView.IndexPathForRowAtPoint(point);

        // do associated calculations here
    }
}

答案 2 :(得分:0)

我认为你的手势识别器必须附加到父视图是正确的。在与手势识别器关联的动作方法中,我认为您可以使用Monotouch等效的CGRectContainsPoint()来确定滑动是否发生在特定子视图中。我想你必须遍历子视图,直到找到滑动发生的那个。我不知道一种方法可以立即识别刷过的子视图。