I will assume you mean two views in the same window. If the views draw outside their frames, which any view may do when clipsToBounds is NO, then you will have to get the true bounding frame of the view contents.
If you have two views with the same parent view and you want to see if they intersect you can use the following:
CGRect frame1 = [view1 frame];
CGRect frame2 = [view3 frame];
CGRectIntersectsRect( frame1 , frame2 );
If the two views do not have the same parent, then you would have to find a common parent of both views and use:
CGRect frame1 = [parent convertRect:[view1 frame] fromView:view1];
CGRect frame2 = [parent convertRect:[view2 frame] fromView:view2];
If you want to know if the views overlap completely, instead of if they overlap a little then use this instead of CGRectIntersectsRect:
CGRectContainsRect( frame1 , frame2 ) || CGRectContainsRect( frame2 , frame1 )
If the two views are not opaque, then even though their frames intersect the contents of the views may not. Figuring that out is totally dependent on the specific contents of the views.
Once you have figured out that the views do overlap, you can figure out which one is on top by examining [parent subviews] and seeing which view has a higher index. If either view is not a direct subview of the parent, you can walk the subviews and use isDescendantOfView to find the order.
To find out if a view is hidden in general, you would compare it to every other view that has a higher z order. The z order of a view is the same as the index in the subviews array, so the subview at index 2 has a higher z order than the subview at index 1. Start in the parent of the view then ascend the view hierarchy.