2012-06-27 26 views
16

我目前正在使用UIScrollView作为滚动/拖动我在应用程序上显示的图形的光标/标记的方式。我使用scrollViewDidScroll等来检测contentoffset的位置,并根据此位置操纵我在屏幕上显示的内容。ios是否有可能让uiscrollview在检测到用户单击时仍然提供拖动滚动功能?

我的问题是,是否有可能在屏幕上检测到用户的单击并获取该水龙头的位置(然后将contentoffset设置到该位置)?

我已经阅读了一些教程,描述了创建一个uiscrollview的子类,但它看起来像这些子类只会占一个水龙头,而不是拖动/滚动也。

有没有人有任何关于我如何能够检测到用户在我的UIScrollView上单击的同时仍然具有滚动/拖动功能?
预先感谢您!

+0

为UIScrollViews一般的做法是不符合的方式烂摊子用户与他们交互。苹果公司创造它们是出于某种原因 - 你需要不同的行为,创造你自己的观点。除此之外,虽然我不清楚你想检测水龙头的原因。用户会在滚动视图中点击,然后你说你会将contentOffset设置为tap的位置,但contentOffset描述了可在scrollview中查看的内容的左上角,所以......你究竟是什么意思? – WendiKidd

+0

是的,因为contentoffset是我如何确定屏幕上“滚动视图”的位置。换句话说,contentoffset就像是用户所在滚动视图向下多远的标记。所以,我根据scrollview的位置(即contentoffset)更改标签的文本。因此,我希望用户的水龙头根据用户在scrollview_ –

回答

30

使用您的滚动视图对象以下代码:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTapGestureRecognizer]; 
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project 

}

- (void)singleTap:(UITapGestureRecognizer *)gesture { 
//handle taps 
} 
+0

哈哈,这个正是(好,几乎完全)我提出的解决方案!但无论如何谢谢你! –

+0

其实你只需要设置cancelsTouchesInView为numberOfTapsRequired和enabled就默认设置为1和YES:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/ – dnlcrl

+0

现在你可以创建一个UITapGestureRecognizer在故事板中拖动一个更短代码的动作。 –

0

你有没有考虑过将UITapGestureRecognizer附加到scrollView?我已将UITapGestureRecognizer附加到UIScrollView,并在需要触摸时使用–gestureRecognizerShouldBegin:和/或–gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:取消内置的平移。

1

问题的第一部分非常简单。如果你有一个UIScrollView子类,你可以再补充一个touchesEnded覆盖,看起来像这样:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

     CGPoint location = [touch locationInView:self]; 

     [self setContentOffset:location animated:YES]; 

    } 


} 

在滚动视图的情况下,对触摸-locationInView实际上已经有ContentOffset添加进去。该代码将执行的操作是滚动滚动视图,以便用户触摸的点位于视图的左上角。这可能不是你想要的,所以你必须做一些事情,如添加一个偏移量,如果你想滚动最后10个像素,或者你会使另一个CGPoint只有x值不在位置如果您的滚动不是从左到右。

这不会干扰能够真正做滚动。

+0

上点击的位置来设置/更新contentoffset,这对于UIGestureRecognizer不会做的事情来说太棒了(大部分时间对我来说似乎是!) –

6

斯威夫特3

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:))) 
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1 
scrollViewTapGestureRecognizer.isEnabled = true 
scrollViewTapGestureRecognizer.cancelsTouchesInView = false 
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer) 

func scrollViewTapped(_ sender: UITapGestureRecognizer) { 
    print("UIScrollView was tapped.") 
} 
相关问题