O que exatamente está acontecendo neste código SwiftUI, eu me pergunto. Quero alinhar a visualização azul à borda inicial da área segura no modo paisagem. O código abaixo funciona, mas se eu remover o ajuste de -0,5 pontos no cálculo blueOffset
abaixo, ele simplesmente não funciona. Ele Blue View
simplesmente preenche toda a área segura na borda inicial. Eu me pergunto o que a mágica -0.5
faz?
@ViewBuilder
var secondBody:some View {
Color.green.opacity(0.3)
.ignoresSafeArea()
.onGeometryChange(for: CGRect.self) { proxy in
proxy.frame(in: .global)
} action: { newValue in
viewSize = newValue.size
}
.background {
Color.blue
.ignoresSafeArea()
.aspectRatio(verticalSizeClass == .regular ? 9.0/16.0 : 16.0/9.0, contentMode: .fit)
.onGeometryChange(for: CGRect.self) { proxy in
proxy.frame(in: .global)
} action: { newValue in
blueViewSize = newValue.size
//This line, why it works????
blueOffset =
verticalSizeClass == .regular ? 0 :
(viewSize.width - blueViewSize.width)/2 - 0.5
print("Blue offset \(blueOffset)")
}
.offset(x: -blueOffset)
}
.persistentSystemOverlays(.hidden)
}
Para visualizações que gostam de expandir, como
Color
, elas preencherão toda a área insegura, desde que cruzem/toquem a área insegura. O-0.5
está basicamente impedindo que a visualização azul toque a área segura. O valor mínimo real que você precisa subtrair épixelLength
- o comprimento de um pixel em pontos.Dito isso, se você quiser apenas que a visualização azul respeite a borda inicial da área segura, você deve fazer:
O valor padrão para
edges:
é.all
, então a borda inicial também é ignorada. Como você não quer ignorá-la, você deve passar todas as outras bordas, exceto.leading
.