确定UIView对用户是否可见?

8 浏览
0 Comments

确定UIView对用户是否可见?

我的UIView是否可见于用户?我的视图被添加为UITabBarControllersubview多次。每个视图实例都有一个NSTimer来更新视图。然而,我不想更新对用户不可见的视图。这可行吗?

0
0 Comments

在确定UIView对用户是否可见时,我们可以使用以下方法。首先,我们可以检查UIView的window属性是否为nil。如果UIView的window属性不为nil,则意味着UIView在屏幕上可见。另外,我们还可以检查UIView的hidden属性是否为true,以及UIView的alpha属性是否大于0,来确定UIView是否可见。

以下是一个示例代码:

if view.window != nil && !view.isHidden && view.alpha > 0 {

// do stuff

}

当然,如果可能的话,我们还应该在UIView不可见时手动隐藏它,并在UIView隐藏时停止计时器。这样可以节约系统资源,并确保在不需要时不进行不必要的操作。

需要注意的是,有时候即使UIView的父视图在视图层次结构中,但UIView的window属性仍然为nil。这是因为UIView的window属性表示它是否被添加到窗口中进行显示。如果UIView尚未添加到窗口中,它的window属性将为nil。因此,在使用上述方法进行判断时,需要确保UIView已经被添加到窗口中。

希望以上内容能够帮助你确定UIView是否对用户可见,以及在需要时如何正确处理。

0
0 Comments

问题:如何确定一个UIView对用户是否可见?

原因:确定一个UIView是否对用户可见可以用于判断一个子视图是否在UIScrollView中至少部分可见。

解决方法(Swift 5.x):

func isVisible(view: UIView) -> Bool {

func isVisible(view: UIView, inView: UIView?) -> Bool {

guard let inView = inView else { return true }

let viewFrame = inView.convert(view.bounds, from: view)

if viewFrame.intersects(inView.bounds) {

return isVisible(view: view, inView: inView.superview)

}

return false

}

return isVisible(view: view, inView: view.superview)

}

解决方法(旧版本的Swift):

func isVisible(view: UIView) -> Bool {

func isVisible(view: UIView, inView: UIView?) -> Bool {

guard let inView = inView else { return true }

let viewFrame = inView.convertRect(view.bounds, fromView: view)

if CGRectIntersectsRect(viewFrame, inView.bounds) {

return isVisible(view, inView: inView.superview)

}

return false

}

return isVisible(view, inView: view.superview)

}

可能的改进:

- 考虑alpha和hidden属性。

- 考虑clipsToBounds属性,因为如果为false,一个视图可能超出其父视图的边界。

这个解决方法非常完美。我有一个堆叠视图作为滚动视图的内容,确定哪些arrangedSubviews是(至少部分)可见正是我所需要的。

感谢您的帖子。我的用例需要检查它是否完全可见,我发现我可以通过将`intersects`替换为`contains(_:)`来实现这一点。

0
0 Comments

如何确定UIView对用户是否可见?

在确定UIView是否对用户可见时,可以检查以下几点:

- 首先,检查view.hidden属性是否为true,即该视图是否被隐藏。

- 其次,通过检查view.superview是否为nil来确定该视图是否在视图层次结构中。

- 另外,可以检查视图的边界来确定它是否在屏幕上。

然而,上述方法可能无法解决所有情况。如果一个视图被其他视图遮挡,也就是说它被其他视图所覆盖,那么以上方法可能无法准确判断该视图是否可见。在这种情况下,需要遍历所有位于该视图之后的视图,以确定是否有视图遮挡了它。

实现这种遮挡检查可能比较困难。需要检查所有不透明的子视图的边界,并记录视图的未被遮挡部分,以便与下一个子视图进行比较。为了简化操作,可以定义一些点,并检查这些点是否可见,如果所有点都可见,则假设该视图可见。可以根据要求,选择所有点可见时表示该视图可见,或者只要有一个点可见即满足要求。

此外,如果UIView位于另一个UIView中,而该UIView又位于UIScrollView中,第三种方法仍然适用。但如果任何一个父视图被隐藏,那么该视图仍然不可见。

除了以上方法外,还可以通过检查视图的alpha值来确定视图是否可见。

需要注意的是,以上方法可能无法解决所有情况,因为视图可见性的判断可能存在许多其他原因,因此很难确定一个全面的答案。

0