为所有 UIScrollView 的子类为 Pan Gesture 提供标签

Posted

技术标签:

【中文标题】为所有 UIScrollView 的子类为 Pan Gesture 提供标签【英文标题】:Give tag to Pan Gesture for all UIScrollView's Subclass 【发布时间】:2014-02-21 06:30:35 【问题描述】:

在我的应用程序中,我有一个UIScrollView,我在其中动态放置UIButtons。我给UIScrollView 中的所有按钮添加了标签。 我需要 UIScrollView 中每个按钮的平移手势。但问题是只有最后一个按钮获得了 Pan Gesture不是所有的按钮。

我的代码:

for (int i =0; i<[arrayForTitles count]; i++)
       
    view = [[UIView alloc] init];
    [view setBackgroundColor:[UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.85]];
    view.tag=i;
    view.frame = CGRectMake(0, varForTitleViewHeight, scrView.frame.size.width, 50);
    [scrView addSubview:view];

    //************** view when pan gesture done  ********************

    viewForPanGesture = [[UIView alloc] init];
    [viewForPanGesture setBackgroundColor:[UIColor colorWithRed:0.0/255.0 green:161.0/255.0 blue:255.0/255.0 alpha:1.0]];
    viewForPanGesture.tag=i;
    viewForPanGesture.frame = CGRectMake(100, varForTitleViewHeight, 151, view.frame.size.height);
    [scrView addSubview:viewForPanGesture];

    btnOnScrollTitle = [UIButton buttonWithType:UIButtonTypeCustom];
    btnOnScrollTitle.frame = CGRectMake(0,varForTitleViewHeight,scrView.frame.size.width, 50);
    [btnOnScrollTitle setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
    btnOnScrollTitle.tag = i;
    [btnOnScrollTitle addTarget:self action:@selector(blackViewMethod:) forControlEvents:UIControlEventTouchUpInside];
    [scrView addSubview:btnOnScrollTitle];

    panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [panGesture setDelegate:self];
    [panGesture setMaximumNumberOfTouches:1];
    [btnOnScrollTitle addGestureRecognizer:panGesture];

    varForTitleViewHeight = varForTitleViewHeight+51;

现在,如何为UIScrollView 的每个对象赋予平移手势,而不仅仅是最后一个对象。

任何想法、代码、教程或链接都会有很大帮助...

【问题讨论】:

【参考方案1】:

代码没有错误,不需要任何修改。你只是用错误的方式访问它们。 这里是它的代码。

-(void)handlePan:(UIGestureRecognizer *) sender
 
   if ((UIButton *)[sender.view viewWithTag:0])   //where  no. '0' tag of button.;
      
         // code it
      
   if ((UIButton *)[sender.view viewWithTag:1])   
      
         // code it
      


 

【讨论】:

是的,但是兄弟,这是用于静态视图的。我在 UIScrollView 中有动态视图。它可能包含 100 个视图或可能是 1000 个。因此需要区分所有视图的所有平移手势。 如果它相似,你可以使用任何循环函数。 当平移手势发生时,我只是在滑动另一个小视图,就像在表格视图的默认编辑单元格功能中一样。并且您的答案不适用于动态视图。 您的代码不能完美运行......对于我使用的动态视图 if ((UIButton *)[sender.view viewWithTag:sender.view.tag]) 它会给我视图手势的确切标签。之后需要进行一些合乎逻辑的整理。我接受你的回答,因为你给了我一些暗示。快乐的编码......

以上是关于为所有 UIScrollView 的子类为 Pan Gesture 提供标签的主要内容,如果未能解决你的问题,请参考以下文章

以 UIScrollView 作为子类的 UIView 不接收触摸事件

子类化 UITextView 时实现 UIScrollView 方法

子类化 UIScrollView 时的奇怪行为

UIScrollView 中的 UIView 子类如何处理内存

具有多个 UIScrollView 类和/或子类的 setScrollsToTop (UITableView)

在 UIScrollView 中停止和启动视频