0

私はSwiftUIが初めてで、初めて学習しましたが、以下のスニペットが機能しない理由を理解できませんでした。理想的には、VStackは全方向に伸び、Imageは縦横比を失うことなく 200px の幅を持つ必要があります。

コード

struct ContentView: View {
    var body: some View {
        VStack() {
            Image("Image Name")
                .resizable()
                .frame(width: 200)
                .aspectRatio(contentMode: .fit)
        }
        .background(Color.red)
        .frame(maxWidth: .infinity,maxHeight: .infinity)
    }
}

誤って修飾子を並べ替えた後、機能しました。では、毎回ヒットと試行の方法を使用せずに、修飾子の正しい順序を知るにはどうすればよいでしょうか?

// new VStack modifier order 
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.red)

// new Image modifier order
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 200)
4

1 に答える 1

3

現時点で考える最良の方法は、SwiftUI がすべての修飾子の後にビューをレンダリングすることを想像することです。したがって、 .background(Color.red) と言うとすぐに、指定したフレームに関係なく、背景が赤で色付けされます。後でフレームを拡張すると、背景が魔法のように再描画されることはありません。背景は既に適用されています。

もちろん、これは SwiftUI が実際にどのように機能するかではありません。なぜなら、そうするとパフォーマンスの悪夢になるからです。

詳細については、このリンクを参照してくださいhttps://www.hackingwithswift.com/books/ios-swiftui/why-modifier-order-matters#:~:text=Every%20time%20we%20modify%20a,up%3A %20ModifiedContent%3CModifiedContent%3C%E2%80%A6

于 2021-03-27T18:46:19.510 に答える