如何处理自定义视图框架

时间:2015-09-16 18:32:16

标签: ios objective-c uiview

我有一个带有自定义弹出窗口的自定义视图(添加为子视图)。 当我打开这个弹出框时,它的框架超出了父视图框架。 我无法在外部弹出视图上处理用户交互。 我该如何解决?

enter image description here

我想到了这个计划:  1.在superview上添加自定义视图;  2.在superview上添加自定义弹出窗口(右侧是自定义视图所在的位置)

但我认为这不是正确的方法。 有什么建议吗?

3 个答案:

答案 0 :(得分:0)

说实话,我还没有尝试过,但您可能会在超级视图上添加自定义视图并覆盖pointInside:withEvent:

我认为超级视图认识到水龙头不会发生在自己的框架内,所以它甚至不会检查其子视图。但是,如果您覆盖pointInside:withEvent:,则可以检查点击位置是否位于子视图框架内,无论它是否在超视图框架内。

如果这不起作用,您可能还必须覆盖hitTest:withEvent:(或代替)。如果你需要更多的方向,我可以尝试找出一个例子。

答案 1 :(得分:0)

答案 2 :(得分:0)

你提到的实际上是正确的方法:你应该有一个superview(它可以是透明的(清晰的颜色)),它包含自定义视图和框架内的弹出窗口。

在iOS上,触摸事件被发送到视觉层次结构中的低级接收器(我相信这是您特定的窗口)。该接收器在其子视图上调用HitTest以确定将事件转发到哪一个。这会以递归方式发生,直到HitTest在所有视图的子视图上失败。然后这些子视图的父级处理(或不处理)触摸事件。

但是在HitTest实现甚至开始在子视图上调用HitTest之前,它在superview上调用了PointInside。如果PointInside为触摸点返回false,则HitTest返回null。

因此,在您调用SuperView的类上重写PointInside可能会解决您遇到的问题,但不一定如此。您可能需要在SuperView的超级视图上覆盖PointInside,然后在该视图的超级视图上覆盖,依此类推。这不是一个好的解决方案,它是脆弱和hacky。重写PointInside确实有它的用途,但这不是一个。

因此,尽管您必须创建一个除了包含其他视图之外没有其他理由存在的透明超级视图,因此请尽量将所有视图保留在其超级视图的范围内。没关系。