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 回答