UIViewがユーザに見えているかどうかを調べるのは難しい。
viewWillAppearなどのライフサイクルメソッドが実行されたかどうかを確認するだけだと、他のビューの下に隠れている場合や表示領域外にある場合を考慮できない。
以下を地道にコードを書いてチェックしないといけないっぽい。
・view.hiddenがfalseか
・view.superview != nilか
・view.frameがscreenの表示領域に入っているか
convertPoint:toView:を使ってUIWindow上でのframeを計算すれば出来そう。
・祖先ビューがclipToBoundsしてないか。している場合、そのビューのframe内に入っているか
これは親ビューをどんどんたどっていって調べないといけないので計算量が多くなりそう。
・調べているビューより手前にある他のビューが被っていないか
これかなりしんどそう。zIndexが調べているビューより手前のビューを全部調べるのがしんどい。。
これはFW側で解決してほしいなぁ。。
参考:iphone - Determine if UIView is visible to the user? - Stack Overflow