使用UILongPressGestureRecognizer对于UIScrollView的子视图(U

2019-08-20 05:35发布

在过去的四个小时,我已经尝试了许多堆栈过低的解决方案,但没有帮助解决我的问题。

这里是,

  • 我有一个UIScrollView
  • 内滚动型有一个自定义的UILabel和8周自定义的UIImageViews
  • 我想检测长按
  • 事情是这样的作品

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
    longPress.minimumPressDuration = 0.5; [scroll addGestureRecognizer:longPress]; //scroll defined elsewhere

但是,如果我有滚动的任何子视图代替滚动,长按事件永远不会触发。

  1. 如何检测一个滚动视图的子视图长按?
  2. 这是一个相当混乱的黑客,但是,因为我可以检测一个滚动视图中长按,有没有什么办法,我可以检测印刷机的位置,这样我可以看到被压哪些具体子视图。

另外, (insert subview here).userInteractionEnabled = YES ,我将此属性设置为我的滚动视图的所有子视图,所以这不应该是一个问题。

我在堆栈溢出其他地方的建议也使用的touchesBegan和touchesEnded方法尝试。

此外,对于图像的观点,我不设置新的UILongPressGestureRecognizer对每个自定义图像视图,使用for循环,因为我知道每个手势识别规则1点看法。

从第一时间iOS开发,

格雷厄姆

PS我真的很喜欢,如果我能找到一个解决方案为1,而不是凌乱2。


更多的代码的要求:

在视图控制器的初始化

 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
longPress.minimumPressDuration = 0.5;
[self.titleLabel addGestureRecognizer:longPress]; //titleLabel property initialized elsewhere
[mainView addSubview:self.titleLabel];

在“负载的图像”的方法

for (NSData * dataImg in results) {
//Does some work turning data into an image, into an image view called img
        img.delegate = self;
        img.userInteractionEnabled = YES;
        UILongPressGestureRecognizer *aLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
        aLongPress.minimumPressDuration = 0.5;
        [img addGestureRecognizer:aLongPress];
        [imgContainer addSubview:img];
}

更多的代码+注

self.view(的UIView)

- >滚动(UIScrollView中)

- > - > MAINVIEW(UIView的)

- > - > - > titleLabel(的UILabel)

- > - > - > imgContainer(UIView的)

- > - > - > - >图像(的UIImageViews)

[self.view addSubview:scroll];
[scroll addSubview:mainView];
[mainView addSubview:self.titleLabel];
[mainView addSubview:imgContainer];
[imgContainer addSubview:img]; //done 8x via for loop

感谢@正则表达式的答案,我现在知道,MAINVIEW是越来越压制,但不是它的子视图,所以我需要找到一种方式来显示它上面的MAINVIEW的子视图。 :)

另一个更新,titleLabel工作。 ImageViews仍然没有工作,虽然。 :(

Answer 1:

I know this is a bit late and an answer has been chosen, but in case someone else wants a nice simple solution if you've got iOS7.

Inside your delegate of the UILongPressGestureRecognizer implement the gestureRecognizer:shouldRequireFailureOfGestureRecognizer:otherGestureRecognizer selector

Check if otherGestureRecognizer is a UIPanGestureRecognizer and return YES, otherwise return NO

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }

    return NO;
}

The scroll view will actually produce a UIScrollViewPanGestureRecognizer, which is part of the private API, but it's a subclass of UIPanGestureRecognizer so the above works fine.

To support iOS6 or below, then you'll need to loop through the gestureRecognizers of the UIScrollView, detect which one is a UIPanGestureRecognizer and perform the requireGestureRecognizerToFail selector on your UILongPressGestureRecogizer with that.



Answer 2:

你的代码似乎要被罚款,它应该工作我think.i使用下面的代码和它的工作对我来说很好。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPress.delegate = (id)self;
longPress.minimumPressDuration=0.05;
imageView.userInteractionEnabled = YES;
[imageView addGestureRecognizer:longPress];

和它的方法,

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender {
   NSLog(@"detected");

if (sender.state == UIGestureRecognizerStateEnded){
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"YES"    delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
     [alert show];
   } 
}

在这里,我把imageview的滚动视图作为子视图为u说



Answer 3:

由于您的UIScrollView是共同的父,这可能是在您的手势识别必须这样做。 您可以确定正在看着你的行动提供的点的位置按了哪个子视图。 因此,个别子视图不需要手势识别。

所以,你会做这样的事情:

- (void)longPressDidFire:(UILongPressGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
        CGPoint point = [sender locationInView:scroll];
        UIView *tappedView = [scroll hitTest:point withEvent:nil];

这样的话,你有被长期压制的看法。

可能导致动作不火其他的事情将是一个代表问题,或者滚动由被拦截触摸另一个视图包含。

HTH



Answer 4:

代替

 [scroll addGestureRecognizer:longPress]; 

增加您的子视图手势,之后你声明它们,你将它们添加到滚动型前

 [subview addGestureRecognizer:longPress]; 


Answer 5:

哇噢它的作品!

问题是:

imgContainer是几个的UIImageViews作为子视图的空帧一个UIView

的印象是,为我添加了一个子视图imgContainer,imgContainer将扩大下

这是不正确的

我不得不imgContainer的框架设置为相同的内容框架的滚动视图 ,那么,一切都OK。

我希望这个答案可以帮助任何其他未来的iOS冷杉计时器和我一样。



文章来源: Using UILongPressGestureRecognizer For Subviews of UIScrollview