Я предполагаю, что вы имеете в виду два вида в одном окне. Если представления рисуют вне своих рамок, что может делать любое представление, когда clipsToBounds имеет значение NO, тогда вам необходимо получить истинные ограничивающие рамки содержимого представления.
Если у вас есть два вида с одним и тем же родительским видом и вы хотите увидеть, пересекаются ли они, вы можете использовать следующее:
CGRect frame1 = [view1 frame];
CGRect frame2 = [view3 frame];
CGRectIntersectsRect( frame1 , frame2 );
Если два представления не имеют одного и того же родителя, вам нужно найти общего родителя обоих представлений и использовать:
CGRect frame1 = [parent convertRect:[view1 frame] fromView:view1];
CGRect frame2 = [parent convertRect:[view2 frame] fromView:view2];
Если вы хотите знать, полностью ли перекрываются представления, вместо того, чтобы немного перекрываться, используйте это вместо CGRectIntersectsRect:
CGRectContainsRect( frame1 , frame2 ) || CGRectContainsRect( frame2 , frame1 )
Если два вида не являются непрозрачными, то даже если их рамки пересекаются, содержимое видов не может. Выяснение этого полностью зависит от конкретного содержания представлений.
Как только вы выяснили, что представления перекрываются, вы можете выяснить, какое из них сверху, изучив [родительские подпредставления] и увидев, какое представление имеет более высокий индекс. Если любое из представлений не является прямым подпредставлением родителя, вы можете просмотреть подпредставления и использовать isDescendantOfView, чтобы найти порядок.
Чтобы выяснить, является ли представление вообще скрытым, вы бы сравнили его с любым другим представлением, имеющим более высокий z-порядок. Порядок z представления совпадает с индексом в массиве подпредставлений, поэтому подпредставление в индексе 2 имеет более высокий порядок z, чем подпредставление в индексе 1. Начните с родительского представления, затем поднимитесь по иерархии представления.