iOS 我的 UIView 在屏幕上可见吗?

Posted

技术标签:

【中文标题】iOS 我的 UIView 在屏幕上可见吗?【英文标题】:iOS Is my UIView visible on screen? 【发布时间】:2014-10-08 11:18:36 【问题描述】:

我有一个自定义的UIView,它带有一个计时器来显示当前时间,该时间设置在UITableViewCell 中。有没有办法检测到用户不再查看我拥有的这个自定义UIView(比如导航到不同的选项卡)?当我的UIView 在屏幕上不再可见时,我想停止此计时器。我正在使用 Swift。

我看到有一个我可以重写的方法称为didMoveToWindow,它似乎在我更改选项卡时触发,但我对 ios 不是很有经验,以及要寻找哪些方法或属性来判断视图是否是否对用户实际可见或不在屏幕上。

我需要某种被调用的方法,类似于viewDidAppearviewDidDisappearfor UIViewController

提前致谢!

【问题讨论】:

How to tell if UIViewController's view is visible的可能重复 我不同意,我已更新文本以澄清。我需要一种方法来获得通知,当它在视野中时,当它发生时。如果我需要一个计时器或其他东西来做到这一点,那么当我离开视野时停止计时器的全部意义就没有了。 【参考方案1】:

我找到了一个适用于此目的的答案,只需覆盖 didMoveToWindow 并检查 self.window 是否为 nil:

override func didMoveToWindow() 
    if (self.window == nil) 
        timerStop()
     else 
        timerStart()
    

【讨论】:

这对于视图被其他视图阻止的情况没有帮助。 很高兴知道,但这对我们制作的应用程序帮助很大。 :)【参考方案2】:

当视图不再向用户显示时处理操作的最佳做​​法是重写 viewWillAppear 和 viewDidDisappear 函数。

启动计时器:

override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)

    timerStart()

然后停止你的计时器:

override func viewDidDisappear(animated: Bool) 
    super.viewWillDisappear(animated)

    timerStop()

【讨论】:

viewWillAppearviewDidDisappear 来自 UIViewController 所以我不能使用这些,除非我有一个 UIViewController 我创建了这些事件,这完全违背了我追求的目的.我有一个 viewcontroller -> tableview -> tableviewcell -> mylabelclass,所以我需要在我的 labelclass 中独立且不紧密耦合的东西。 好吧,对不起我的错。然后您正在寻找的两种方法是awakeFromNib(启动您的计时器)和deinit(停止它)。试试这个,如果这能解决您的问题,请告诉我。

以上是关于iOS 我的 UIView 在屏幕上可见吗?的主要内容,如果未能解决你的问题,请参考以下文章

IOS:UIView 永远可见

如何获取部分平移到屏幕外的 UIView 的可见部分?

如何让我的 UIView 在 Xcode 的 Storyboard 编辑器中可见?

判断 UIView/Image 当前是不是可见

UIView 是不是可见?

按下按钮时的 UIView 动画 - 第一次尝试时不可见