【问题标题】:UIButton inside scrollview not triggering action滚动视图内的UIButton不触发动作
【发布时间】:2013-12-24 18:31:27
【问题描述】:

我在滚动视图中有一个名为 subADCview 的视图,这个 subADCView 动态生成按钮。目前,如果按钮的数量不适合单行(即在我的 subADCview 中,宽度约为 320,高度为 54),则视图高度会扩展并变为可滚动。并且还有删除按钮的规定。现在,如果我在多行中有更多数量的按钮并且只需删除它们就可以正常工作并且没有问题,但是如果我进行一些滚动然后删除按钮它可以工作,直到按钮适合单行,只要视图减少以包含单行中的按钮,里面的按钮不会触发动作。奇怪的!!但是,如果我不滚动而只是简单地删除按钮,它就会起作用。我不知道滚动有什么问题,只要我进行一些滚动然后删除它可以工作的按钮,直到它们适合单行。我已经使用了点击手势和所有,并且触摸确实触发了点击手势方法并返回“NO”,但是没有触发标志按钮动作,看起来按钮被禁用但日志显示它已启用。下面是我的代码和一些日志。如果您能提供帮助,不胜感激。

//点击手势部分

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{

    NSLog(@"touchview:%@,tag:%d",[touch.view class], touch.view.tag);

    if ([touch.view isKindOfClass:[UIButton class]])
    {
        UIButton *btn=(UIButton*)touch.view ;

        NSLog(@"Properties:%@,%hhd,%hhd",btn,btn.userInteractionEnabled,btn.enabled);

    }

    if (self.scrollView.superview != nil)
    {
        if ([touch.view isKindOfClass:[UIButton class]]||[touch.view.superview.superview isKindOfClass:[UITableViewCell class]]||[touch.view.superview.superview.superview isKindOfClass:[UITableViewCell class]]||[touch.view.superview isKindOfClass:[UITableViewCell class]])

        {
           NSLog(@"Value returned is NO");
            return NO; // ignore the touch
        }

    }


     NSLog(@"Value returned is YES");
    return YES; // handle the touch


}

//这是触发按钮动作的函数

 -(void)btnSelected:(UIButton *)button
    {
        NSLog(@"Button %ld Clicked",(long int)[button tag]);



        if (button.tag==0)
        {
            [self pushToGroupCategorySelection];
            for (id btn in self.subADCView.subviews)
            {
                if ([btn tag]!=-999)
                {
                    if ([btn isKindOfClass:[UIButton class]])
                    {
                        [btn removeFromSuperview]; //remove buttons
                    }
                }

            }
            _subADCView.frame=CGRectMake(_subADCView.frame.origin.x, _subADCView.frame.origin.y, _subADCView.frame.size.width, 54.0);

        }
        else
        {
            if (_categoryEditDetails.count==1)
            {
                showAlert(@"Message", @"Group Should Have Atleast 1 category", STRING_CONSTANT_OK,nil);
            }
            else
            {
                [categoryListDeleted addObject:[@{
                                                  @"id": [NSString stringWithFormat:@"%ld",(long)button.tag]

                                                  } mutableCopy]] ;

                for (id btn in self.subADCView.subviews)
                {
                    if ([btn tag]!=-999)
                    {
                        if ([btn isKindOfClass:[UIButton class]])
                        {
                            [btn removeFromSuperview]; //remove buttons
                        }
                    }

                }
                _subADCView.frame=CGRectMake(_subADCView.frame.origin.x, _subADCView.frame.origin.y, _subADCView.frame.size.width, 54.0);

                for (NSUInteger i=0;i<_categoryEditDetails.count;i++)
                {
                    if ([[[_categoryEditDetails objectAtIndex:i]valueForKey:@"id"] caseInsensitiveCompare:[NSString stringWithFormat:@"%ld",(long)button.tag]]==NSOrderedSame)
                    {
                        [_categoryEditDetails removeObjectAtIndex:i];
                        break;
                    }
                }
                [self addDynamicButtonsForCategories];
            }
        }
    }

这是在我进行任何滚动之前按钮位于单行时工作的日志

touchview:UIButton,tag:104
Properties:<UIButton: 0xcc99810; frame = (146 0; 134 40); opaque = NO; tag = 104; layer = <CALayer: 0xcca5290>>,1,1
Value returned is NO
Button 104 Clicked

这是在我进行任何滚动后按钮位于单行时不起作用的日志

touchview:UIButton,tag:104
Properties:<UIButton: 0xd97f5d0; frame = (146 0; 134 40); opaque = NO; tag = 104; layer = <CALayer: 0xd97a810>>,1,1
Value returned is NO

请注意,在这两种情况下,点击手势都有效并且它可以识别按钮触摸,但在第二种情况下,按钮动作没有被触发。我非常感谢任何解决此问题的解决方案,或者如果您能给我更多有关详细故障排除的建议。

【问题讨论】:

  • 你为滚动视图设置了 userInteraction 吗?
  • 如果子视图没有响应,那么可能是父视图的尺寸太小或者帧在子视图开始之前结束。检查您的滚动内容大小。
  • yes userinteraction 已设置,并且 user1111 我检查了滚动框大小,它很好,但没有检查内容大小。也会检查的。

标签: ios iphone objective-c uiscrollview uibutton


【解决方案1】:

我无法找出确切的问题,但我认为这与视图大小和滚动视图内容大小的问题有关,尽管在日志中一切似乎都很好。无论如何,我删除了我的 subADCview 并直接在我的滚动视图中添加了动态按钮,它工作得很好,没有任何问题。

【讨论】:

    【解决方案2】:

    在带有 iOS 7 的 XCode 5 中存在一个错误,可以通过关闭 AutoLayout 来解决此问题。

    只需取消选中侧边栏中的此框,您就可以开始了。

    【讨论】:

    • 好的,我仍然会保留答案,因为它可能会帮助其他人。祝你一切顺利!
    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 2021-07-26
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    相关资源
    最近更新 更多