Разница между ZStack и использованием .overlay()
В чем разница между использованием ZStack
по сравнению с использованием .overlay()
модификатор.
Apple говорит:
ZStack
= "Представление, которое накладывает свои дочерние элементы, выравнивая их по обеим осям."
.overlay
= "Накладывает дополнительный вид перед этим видом."
Некоторые примеры:
ZStack(alignment: .bottom) {
Image(systemName: "folder")
.font(.system(size: 55, weight: .thin))
Text("❤️")
}
Image(systemName: "folder")
.font(.system(size: 55, weight: .thin))
.overlay(Text("❤️"), alignment: .bottom)
Не учитывая размер кода, есть ли какая-то особая цель, в которой один должен использоваться вместо другого?
1 ответ
В ZStack
представления независимы друг от друга, и стек подходит (если не имеет собственного фрейма) для самого большого представления. Также порядок в ZStack можно изменить с помощью.zIndex
модификатор. Все виды находятся в координатном пространстве ZStack.
В .overlay
в случае, если представление внутри наложения всегда привязано к родительскому представлению и всегда выше родительского представления (т.е. zIndex не играет никакой роли). Также наложенные виды находятся в координатном пространстве родительского вида.
Наиболее заметная разница заключается в том, чтобы сделать виды разного размера и применить отсечение, т.е.
struct TestZStack: View {
var body: some View {
ZStack(alignment: .bottom) {
Image(systemName: "folder")
.font(.system(size: 55, weight: .thin))
Text("❤️").font(.system(size: 55, weight: .thin))
}
.clipped()
}
}
дает
struct TestOverlay: View {
var body: some View {
Image(systemName: "folder")
.font(.system(size: 55, weight: .thin))
.overlay(Text("❤️").font(.system(size: 55, weight: .thin)), alignment: .bottom)
.clipped()
}
}