3

我创建了一个自定义子类并UIScrollView实现了touchesBegantouchesMoved和方法。touchesEndedtouchesCancelled

但是,我对事情的运作方式并不满意。特别是,何时提到方法被调用以及何时UIScrollView决定实际滚动(拖动)。

UIScrollView即使第一个触摸点和最后一个触摸点在垂直方向上的差异很小,也会滚动。所以我几乎可以水平滑动,并UIScrollView根据那个微小的差异向上或向下滚动。(这在正常用例中非常好)

默认 UIScrollView 行为

这两种滑动都会导致UIScrollView向下滚动。

但是我很感兴趣是否可以以某种方式对其进行调整,使其行为如下:

期望的行为

基本上,这样几乎水平的滑动就会被相关方法拾取touchesBegan并且不会启动滚动。然而,绿色滑动方向仍会启动滚动......

编辑:

我忘了提,touchesBegan如果您在屏幕上按住手指一小段时间然后移动它,亲戚们就会被叫到。所以不是经典的滑动手势......

4

2 回答 2

2

伊万,我认为你正在尝试做与 Facebook 页面相同的效果,并拖动你的滚动视图,所以让滚动视图跟随你的手指,如果这是正确的,我建议你忘记触摸事件,并从 UIPanGesture 开始,它在这些情况下最好,因此在调用该手势的委托中,为其放置以下代码:

    //The sender view, in your case the scollview
    UIScrollView* scr = (UIScrollView*)sender.view;
    //Disable the scrolling flag for the sake of user experience
    [scr setScrollEnabled:false];

    //Get the current translation point of the scrollview in respect to the main view
    CGPoint translation = [sender translationInView:self.view];

    //Set the view center to the new translation point 
    float translationPoint = scr.center.x + translation.x;
    scr.center = CGPointMake(translationPoint,scr.center.y);
    [sender setTranslation:CGPointMake(0, 0) inView:self.view];
于 2013-04-25T09:16:19.590 回答
2

Christopher Nassar 正确地指出我应该使用UIPanGestureRecognizer,所以我对它进行了一些实验。

我发现,如果您将 a 添加UIPanGestureRecognizer包含您的. 然后内置的平移手势识别器将以我想要的确切方式与您自己的配对工作!UIScrollViewUIScrollViewUIPanGestureRecognizer

水平和接近水平的滑​​动将被超级视图拾取,而所有其他垂直滑动将被UIPanGestureRecognizer内置的(自定义)平移手势识别器拾取并使其滚动......UIScrollView

我想这UIScrollView是这样设计的,因为默认行为是只有这些平移手势识别器中的一个触发,或者如果UIScrollView从此UIPanGestureRecognizerDelegate方法返回 YES 则同时触发:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

然而,它似乎UIScrollView有额外的逻辑来选择性地禁用(对于水平滑动)它自己的平移识别器,以防另一个存在。

也许这里有人知道更多细节。

所以总结一下,我的解决方案是在我的. 中添加一个UIPanGestureRecognizer内部。(注意:作为子视图添加到该视图)viewDidLoadUIViewControllerUIScrollViewUIViewController

UIPanGestureRecognizer *myPanGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self.view addGestureRecognizer:myPanGestureRecognizer];

然后添加处理程序方法:

- (void)handlePan:(UIPanGestureRecognizer *)recognizer
{
    NSLog(@"Swiped horizontally...");
}
于 2013-04-25T11:33:04.860 回答