1
我在應用程序窗口的座標中有一個CGPoint點。
有沒有辦法獲得一個指向視圖可見的指針?在某個點獲取可見視圖
例如我有100個視圖或隨機大小,並放置在隨機位置 - 部分/完全覆蓋對方。
按下應用程序中的按鈕將列出(0,0),(100,100)和(200,200)處可見視圖的地址。
視圖可能會或可能不會啓用userInteraction。
另外,一個視圖被完全透明的視圖覆蓋的更復雜場景呢?
我在應用程序窗口的座標中有一個CGPoint點。
有沒有辦法獲得一個指向視圖可見的指針?在某個點獲取可見視圖
例如我有100個視圖或隨機大小,並放置在隨機位置 - 部分/完全覆蓋對方。
按下應用程序中的按鈕將列出(0,0),(100,100)和(200,200)處可見視圖的地址。
視圖可能會或可能不會啓用userInteraction。
另外,一個視圖被完全透明的視圖覆蓋的更復雜場景呢?
更新
hitTest
,因爲它不會給你的子樹而父母有userInteractionEnabled
設置爲NO
或視圖是其父的範圍之外將無法正常工作。
visibleViewAtPoint
如下所述將解析整個視圖樹併爲視圖提供最高的子視圖索引。這應該給正確的觀點(不帶Z順序考慮...)
- (void) findView:(UIView**)visibleView atPoint:(CGPoint)pt fromParent:(UIView*)parentView
{
UIView *applicationWindowView = [[[[UIApplication sharedApplication] keyWindow] rootViewController] view];
if(parentView == nil) {
parentView = applicationWindowView;
}
for(UIView *view in parentView.subviews)
{
if((view.superview != nil) && (view.hidden == NO) && (view.alpha > 0))
{
CGPoint pointInView = [applicationWindowView convertPoint:pt toView:view];
if([view pointInside:pointInView withEvent:nil]) {
*visibleView = view;
}
[self findView:visibleView atPoint:pt fromParent:view];
}
}
}
- (UIView*) visibleViewAtPoint:(CGPoint)pt
{
UIView *visibleView = nil;
[self findView:&visibleView atPoint:pt fromParent:nil];
return visibleView;
}
目前該代碼未檢測到UIAlertView中,或如UIPickerView等「彈出的意見多數民衆贊成竊聽後呈現UIWebView中的下拉列表。這個代碼是可以修改的,還是屬於「超出父級範圍的視圖」的情況?如果是後者,您還能如何檢測和檢索這些視圖? –
UIAlertView維護它自己的UIScreen,它將在視圖控制器視圖之外,所以這種方法不適用於此。您可能需要追蹤UIAlertView的屏幕(以某種方式)並在那裏執行此方法。 –