以编程方式添加后,UIButtons在UIScrollView中无法单击

时间:2014-09-26 11:14:56

标签: ios uiscrollview uibutton

我在UIScrollView中有一些UIButtons。当视图首次加载时,UIScrollView中显示大约8个按钮,所有这些按钮都可见且可点击。

但是,一旦我滚动,最初加载视图时不存在的任何按钮都不可点击。

鉴于我有一个函数可以在视图加载时以编程方式创建每个按钮,addTarget函数是否可能无效?我在开始时创建了大约280个按钮,并以编程方式添加UITouchUpInside事件。

- 编辑 -

这或多或少是代码,在viewDidLoad函数内部调用

for (int i = 0; i < numberOfButtons; i++){
    //Display stuff here
    MyButton *aButton = [[MyButton alloc] initWithFrame:CGRectMake(x,y,w,h)];
    [aButton.titleLabel setFont:[UIFont fontWithName:@"QuicksandBook-Regular" size: 17.0]];
    [aButton setTitle:[currentDisplayArray objectAtIndex:i] forState:UIControlStateNormal];
    [aButton addTarget:self
                 action:@selector(didPressButton:)
   forControlEvents:UIControlEventTouchUpInside];
    [aButton setUserInteractionEnabled:TRUE];
    NSLog(@"width of button = %f height = %f", [aButton frame].size.height, [aButton frame].size.width);
//I printed this to check the height and width were generated correctly.
    [btnContainerView addSubview:aButton]; //UIView hooked up to storyboard
    [buttonArray addObject:aButton]; //Array to maintain reference to all buttons
}

请记住,它们都正确显示,只是未在初始帧中渲染的那些不会触发“didPressButton”选择器。

- 编辑 -

在玩完之后,我认为它与UIScrollView存在某种问题。这是某种苹果虫吗?我甚至尝试在scrollViewDidScroll函数中添加手势识别器。

- 编辑 - 另一个有趣的提示,如果我使UIScrollView更大,我可以点击更多的按钮,如果我把它缩小,我可以点击更少。它肯定与第一个渲染按钮有关。

也许iOS说它初始化按钮,但不会将所有200多个按钮的选择器保留在内存中。或者每班有一个内置数量的可选择者/手势识别器。

2 个答案:

答案 0 :(得分:1)

是的,我把它解决了。

有一个UIView坐在UIScrollView前面,按钮被添加到。

视图大小相同,但只有初始范围内的按钮(UIView大小)才可以点击。

我认为有一个UIView被称为btnContainerView或其他东西。发生的事情是按钮被添加到这个UIView而不是UIScrollView。

我认为UIView被设置为按钮的委托,因为它们是被渲染的。因此,当UIScrollView收到输入时,降压停在那里。在按钮上调用addTarget:self意味着他们的目标被添加到scrollView,但它们被渲染到UIView上。一个令人困惑的错误,因为你会期望UIScrollView不能正确滚动和渲染,但确实如此,它只是选择器的代表感到困惑。

感谢大家的帮助,这非常棘手,因为按钮正确滚动(UIScrollView得到了触摸输入),但是UIButtons没有得到触摸输入。

<强> TL; DR;解决方案是删除中间的UIView,因为它正在干扰

答案 1 :(得分:-1)

我希望您在视图控制器中使用手势,如果是这样,您可以使用以下代码

  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if (([touch.view isKindOfClass:[UIButton class]] && touch.view.tag==<Btn_Tag>)) {
            return NO;
        }
        return YES;
    }

使用手势时,手势将首先响应而不是按钮动作。因此,此代码将有助于将响应者移动按钮的动作。