UIScrollview - 屏幕外按钮不会触发

Posted

技术标签:

【中文标题】UIScrollview - 屏幕外按钮不会触发【英文标题】:UIScrollview - Off-screen buttons do not fire 【发布时间】:2013-12-30 00:24:13 【问题描述】:

我有一个很长的 UIScrollview,超过了屏幕的宽度。请参阅下面的屏幕截图以供参考。

我以编程方式在动态变化的 for 循环中向此滚动视图添加按钮。有一个“containerView”,它基本上与滚动视图的宽度相同,我实际上是直接在上面添加按钮。那里的代码非常简单,如下所示:

for (int i=0; i<numberOfButtons; i++) 
    UIButton *currentButton = [[UIButton alloc] init];
    [currentButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    [currentButton setBackgroundImage:buttonImage forState:UIControlStateNormal];
    [currentButton setTag:i];
    [currentButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self.containerView addSubview:currentButton];
    // here's where I programatically set constraints for positioning

按钮在正确的位置显示得非常好,并且最初在屏幕上的按钮(即上面屏幕截图示例中的前 2 个)完全可以触发“buttonPressed:”方法。但是,最初不在屏幕上的那些仍然显示正常,但在点击时不会触发事件。

我在那里看到了其他类似的帖子,但似乎没有任何效果。关于这个去哪里的任何想法?我有点难过。提前致谢!

【问题讨论】:

按钮是否进入高亮状态? 好问题,当我按下它们时,最初出现在屏幕上的确实会进入高亮状态,但屏幕外的则不会。 这通常是由于按钮超出了它们的超级视图的范围造成的。你应该给 containerView 一个背景颜色,看看这是否属实。 宾果游戏!我将 containerView 的背景设置为白色,瞧,当我向右滚动时,白色在屏幕边缘的确切位置结束。现在我需要找到一个修复程序来适当地调整这个大小。感谢您对此的回答! 【参考方案1】:

事实证明,这个问题的答案正是 rdelmar 在他的评论中指出的。 containerView 的框架被设置为屏幕大小的边界,所以当我将背景颜色更改为白色时,很明显边界被限制为初始屏幕宽度。

修复非常简单 - 一旦 for 循环完成,我就知道 containerView 需要多长时间,所以我只是将那里的框架设置为适当的宽度。问题已解决!

【讨论】:

【参考方案2】:

在你的 for 循环之后,你需要确保你正在设置滚动视图的内容大小

[self.containerView setContentSize:CGSizeMake(MAX_X_FROM_LAST_BUTTON, self.containerView.frame.size.height)];

【讨论】:

我确实确认滚动视图的 contentSize 设置正确。我什至记录了它以确保(见下文)。但是,我在通过循环并向其添加按钮之前设置了 contentSize。我认为这不应该有什么不同,但我想确定一下,因为你提到它应该在 for 循环之后完成?内容大小:4813.000000,152.000000 我不确定,我提到这个的唯一原因是因为你没有将它包含在你的代码 sn-p 中。之后您是否尝试过设置 contentSize 以查看是否有所不同?

以上是关于UIScrollview - 屏幕外按钮不会触发的主要内容,如果未能解决你的问题,请参考以下文章

对于以编程方式创建的 UIButton,有时不会触发按钮单击事件

弹出窗口内的按钮不会触发弹出窗口外的点击事件

UIScrollview 不会一直滚动

为啥屏幕外的 UICollectionViewCells 不会更新?

iPhone + UIScrollView

在调整屏幕大小时,当移动到溢出按钮时,工具栏中的SplitButton不会触发点击处理程序。