【问题标题】:Detect object on the on screen检测屏幕上的物体
【发布时间】:2017-02-23 07:04:07
【问题描述】:

我有一个包含多个元素(标签、按钮...)的滚动视图,当我滚动时屏幕上出现按钮时,我需要显示图像。

我可以像这样检测按钮何时出现在屏幕上:

func scrollViewDidScroll(scrollView: UIScrollView) {
let offset = self.scrollView.contentOffset
let onScreen = CGRectOffset(self.scrollView.frame, offset.x, offset.y)
if CGRectIntersectsRect(onScreen, self.button.frame) {
    ...
}

}

但我想获取滚动后出现在屏幕上的所有按钮(可能带有标签的数组)。

我该怎么做?

【问题讨论】:

  • 你正在做的将工作,那么有什么问题?如果需要,您可以创建一个包含所有视图的数组,就像您说的那样。
  • 我将所有按钮添加到来自 http 请求的代码中。我为每个按钮标签设置了一些 ID。这是 ID = ID 图像。如果您在停止滚动时浏览所有按钮,它将很长。
  • 一种可能的优化是将所有按钮添加到可以直接访问的数组中,而不必通过标签查找它们。您还可以通过仅将按钮的框架原点与滚动视图的内容偏移量进行比较来更快地检查可见性,因为您并不真正关心完整的交叉点。除此之外,您没有提供足够的信息让我们能够提供任何其他有用的优化。
  • 不,我认为从屏幕上获取所有按钮的标签会更慢。

标签: ios swift scroll uiscrollview uibutton


【解决方案1】:

如果所有按钮都在一个数组中,则使用 NSSet,而滚动按钮则使用 NSMutableSet。

因此,在滚动之前,请执行以下操作:

NSMutableSet *scrolledButtons = [[NSMutableSet alloc] init];

当它们滚动时,添加它们:

[scrolledButtons addObject:aButton];

然后,完成后,只需检查一下:

NSSet *allMyButtons = [NSSet setWithArray:self.myArrayOfButtons];
if ([allMyButtons equalToSet:scrolledButtons]) {
    // whatever
}

并为在 Obj-C 中做这件事而道歉......我的 Swift 还不够好,我正在快速做这件事。

【讨论】:

  • 不,不,不。我想获取滚动后出现在屏幕上的所有对象标签(取消按钮、uilabel)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多