【问题标题】:UIButtons not clickable in UIScrollView after being added programatically以编程方式添加后,UIButton 在 ScrollView 中不可点击
【发布时间】:2014-11-21 09:20:10
【问题描述】:

我在 UIScrollView 中有一些 UIButton。首次加载视图时,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 多个按钮的选择器保存在内存中。或者每个类具有内置数量的可能选择器/手势识别器。

【问题讨论】:

  • 你能分享一些代码吗?至少是您以编程方式创建按钮的部分。
  • 请检查您是否在方法后面添加了 (:)
  • 是的,我的选择器方法有一个参数,谢谢。
  • 尝试更改您的按钮代码。您不使用 alloc/init 创建按钮。而是使用:= [UIButton buttonWithType:]。然后用 setFrame 设置框架。或者使用你现在应该使用的自动布局:-)
  • @CW0007007 我试过这个,但不幸的是它没有用。 :(

标签: ios uiscrollview uibutton


【解决方案1】:

是的,我解决了。

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

视图大小相同,但只有初始边界(UIView 大小)内的按钮是可点击的。

有一个 UIView,我认为它被称为 btnContainerView 之类的。发生的事情是按钮被添加到这个 UIView 而不是 UIScrollView。

我认为 UIView 被设置为按钮的委托,因为它们是被渲染的。因此,当 UIScrollView 收到输入时,降压就停在那里了。在按钮上调用 addTarget:self 意味着它们的目标被添加到滚动视图中,但它们被渲染到 UIView 上。一个令人困惑的错误,因为您希望 UIScrollView 不能正确滚动和呈现,但它确实如此,它只是选择器的委托变得混乱。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 不抱歉,我尝试了一个手势识别器,虽然它适用于呈现的按钮,但它不会影响初始滚动范围之外的按钮。
    • 一旦移除手势并检查它是否工作。然后我们可以检查其他解决方案
    • 也许你应该提供它:P - 我刚刚将识别器添加到按钮。
    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 2016-07-27
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多