UIView 可以知道它何时在屏幕上吗

Posted

技术标签:

【中文标题】UIView 可以知道它何时在屏幕上吗【英文标题】:Can a UIView know when it is on screen 【发布时间】:2013-09-02 12:04:21 【问题描述】:

我有一个UIView,其中包含许多组件,如果视图被删除或其父视图控制器被弹出/推送,我想更新其中的一些。 UIView 是否有可能获取此信息

类似于UIViewController中的方法

-(void)viewWillAppear;

想要类似的东西

-(void)UIViewWillAppear;

对我看到的一些 cmets 进行编辑:

我再解释一下

但我有一个特殊情况,即 UIView 需要在其自身之上添加一个“浮动视图”(想象一个缩放/平移/滚动 UISCrollView 子类,其自身顶部有浮动),这样当它滚动时浮动视图保持不变相对于超级视图到位。我尝试在-(void)layoutSubviews 方法中重新计算“浮动”的新原点,但重新放置非常不稳定。为了解决这个不稳定的问题,自定义 UIView 添加了浮动视图(理论上是它的子视图)作为其父视图的子视图(有点绕口令:))。 现在,当自定义 UIView 被移除(或者其包含的视图控制器被推到屏幕外)时会出现问题。特殊的 UISCrollView 如何从其 superView 中移除浮动视图。

【问题讨论】:

【参考方案1】:

您可以覆盖willMoveToSuperview: 以了解何时将视图插入到层次结构中以及何时将其移除。这可能不是您想要的,因为视图可以是层次结构的一部分,并且不能自行插入。

要查看它是否在屏幕上,请使用willMoveToWindow:。如果参数不为 nil,则视图只是成为可见视图层次结构的一部分。

如果您在更改后需要做某事,请使用didMoveToWindow:

【讨论】:

看起来它可以工作,但是当方法被调用时,视图已经离开屏幕了。【参考方案2】:

UIView 不会“随机”出现/消失,也不会在需要时出现 - 您的视图控制器(或代码)控制它。因此,您应该找出何时显示它们,并调用您需要的代码。

【讨论】:

我将为我的评论添加一个编辑,这对于这个框来说似乎很长 不,这个问题是有效的。 OP 希望构建一个处理其私有资源的视图。您提出的建议会破坏封装。 更新问题后 - 是的,它是有效的。但是,我认为无论如何都应该通过控制器或其他方法检测主视图何时离开屏幕来解决。【参考方案3】:

UIView class reference 有一些 kvo 观察变化。

通过实现-(void)willRemoveSubview:(UIView *)subview,您可以看到相反的情况。

更新阅读说明后:

我希望我理解正确。我之前做过类似的事情,但使用的是 UITableView 而不是 UIScrollView (但它们在下面完全一样)。

这就像一个弹出式详细视图。正如你已经做的那样,我通过将详细视图添加到 UITableView 超级视图来解决,然后我在详细视图中添加了一个关闭 UIButton,并带有相应的 IBOutlet:

@interface CustomUIView : UIView

@property(nonatomic,weak) IBOutlet UIButtonView *closingButton;

-(void)closeDetail:(IBAction)action;

@end

而行动只是:

-(void)closeDetail:(IBAction)action 
   // do your cleaning/change to the detail subviews
   [self removeFromSuperview]; // <-- clsoe the detail view

sdsds

【讨论】:

以上是关于UIView 可以知道它何时在屏幕上吗的主要内容,如果未能解决你的问题,请参考以下文章

在 UIView 生命周期中知道何时销毁视图

如何知道 UIView 动画何时全部完成

iOS——何时创建子 ViewController 与 UIView 子类?

知道 AVPlayer 对象何时准备好播放

为啥我无法检测到我使用 UIKit Dynamics 推离屏幕的 UIView 何时不再可见?

仅为部分 UIView 设置背景颜色