web-dev-qa-db-ja.com

ビューはデバッグビュー階層に表示されますが、デバイス/ SIMには表示されません

この問題は私をひどく困惑させています。どのボタンが選択されているかを示すために使用している小さなUIViewがあります。ただし、アプリに表示されません。[ローカルアクティビティ]の下にあるはずですが、表示されません。

Image

それは問題ないと思いました。ビュー階層をデバッグして、それがどこにあるかを確認します。そして、それはまさにあるべき場所にあるように見えます:

View Hierarchy3D View — it's on top of everything!

ここで何が起こっているのか誰か知っていますか?助けてくれてありがとう!

27
Kyle Bashour

私は愚かです—私はそれを修正しました。ビューデバッガーの一番上に表示される理由はわかりませんが、別のUIViewの後ろにありました。

8
Kyle Bashour

なぜこれが起こったのかについての情報はたくさんありませんが、これを引き起こしている原因を見つけるのに数時間かかったので、おそらくこれは他の誰かの時間を節約するのに役立ちます:

ビューコントローラ内に2つのサブビュー(サブビューAとサブビューB)をプログラムで作成しました。フレームのサイズと位置、アルファ値、およびその他すべての通常の可視性の問題がすべてチェックアウトされていても、どちらも私のデバイスには表示されませんでした。サブビューAはビューコントローラーのビューのサブビューであり、サブビューBはサブビューAのサブビューでした。どちらもデバイスに表示されませんでしたが、ビューデバッガー階層を見ると、サブビューBを見ることができました(そのスーパービューにもかかわらず、サブビューA、表示されませんでした)。

簡単に言うと、サブビューAのレイヤーのマスクプロパティを変更していたコードを削除すると、この問題は修正されました。レイヤーで呼び出されていた正確なメソッドは次のとおりです。

extension CALayer {
    func round(corners: UIRectCorner, withRadius radius: CGFloat, withBounds: CGRect? = nil) {
        let path = UIBezierPath(roundedRect: withBounds ?? bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.mask = mask
    }
}

私は過去にこの方法を問題なく使用したことがあるので、問題は多少状況に応じたものであると確信していますが、将来的には誰かが正しい方向を示す可能性があります。

編集:

問題は、上記のコードだけでなく、round()を呼び出した後にサブビューAのフレームを変更していたという事実でした。最終的な位置とサイズが指定された後、サブビューAをround()のみにするようにすると、デバイスとデバッガーの両方に関するすべての問題が解決されました。

13
WongWray

Xcode 9でも同じ問題が発生しました。原因は、viewDidLoadでビューのアルファを0に設定したが、アルファを1.0に戻さなかったためです。何らかの理由で、デバッグビュー階層は1.0のアルファでそれを示しました...

6
David T

同じ問題がありましたが、コンセントを配線し直すと、再び機能し始めました。

0
bdelliott