Cómo configurar la altura de un sheet

Misael Cuevas
24 abril, 20244min de lectura
SwiftUI te permite ajustar la altura de los sheets a tu medida utilizando el modificador presentationDetents. Con este modificador, puedes especificar una o varias alturas para tus sheets, que son las siguientes:
large: Esta opción utiliza toda la altura disponible, siendo el valor predeterminado al presentar un sheet en SwiftUI sin necesidad de usarpresentationDetents.medium: Utiliza aproximadamente la mitad de la pantalla como altura.fraction(_:): Emplea una fracción de la altura disponible. El valor debe estar entre 0.0 y 1.0, por ejemplo,.fraction(0.3)para utilizar el 30% de la altura disponible.height(_:): Especifica una altura concreta, por ejemplo,.height(300)para usar 300 puntos de altura.custom(_:): Se utiliza para establecer una altura calculada. Verás un ejemplo de esto más adelante.
Por ejemplo, para mostrar un sheet con una altura aproximadamente a la mitad de la pantalla:
import SwiftUIstruct ContentView: View {// 1@State private var isPresenting = falsevar body: some View {// 2Button("Show sheet") {isPresenting.toggle()}.sheet(isPresented: $isPresenting) {// 3Text("Hello world").presentationDetents([.medium])}}}
- Se define la variable de estado
isPresentingpara determinar cuando se debe de presentar el sheet. - Un botón que al ser presionado cambia el valor de
isPresentingatruepara mostrar el sheet. - Se muestra un texto en el sheet y se utiliza el modificador
presentationDetentspara establecer la altura de este.
Como se mencionó antes, también puedes establecer múltiples alturas, por ejemplo:
.presentationDetents([.medium, .fraction(0.8), .height(200)])
Al establecer varias alturas, se muestra un indicador superior en el sheet que indica que soporta varias alturas.
Para utilizar custom(_:), primero debes crear una estructura que conforme al protocolo CustomPresentationDetent y que requiera definir la altura deseada a través de la función estática height(in context: Context). Por ejemplo:
// 1struct CustomDetent: CustomPresentationDetent {// 2static func height(in context: Context) -> CGFloat? {// 3max(100, context.maxDetentValue * 0.3)}}
- Se define la estructura
CustomDetentque se conforma al protocoloCustomPresentationDetent. - El protocolo
CustomPresentationDetentrequiere definir la altura a través de la funciónheight. El parámetrocontextcontiene información, como valores del entorno, que pueden ayudarte a determinar la altura que deseas definir. - Retorna el valor mayor entre 100 o el 30% de
context.maxDetentValue.maxDetentValuees una propiedad calculada que retorna la altura disponible donde aparecerá el sheet.
De la siguiente manera puedes utilizar la estructura CustomDetent:
.presentationDetents([.custom(CustomDetent.self)])
Por último, es importante destacar que el modificador presentationDetents posee el parámetro selection, que te permite conocer en el código cuál es la altura seleccionada en el sheet y modificarla. Por ejemplo:
import SwiftUIstruct ContentView: View {@State private var isPresenting = false// 1@State private var sheetDetentSelection = PresentationDetent.height(100)var body: some View {Button("Show sheet") {isPresenting.toggle()}.sheet(isPresented: $isPresenting) {// 2Button("Change Size") {sheetDetentSelection = .medium}.presentationDetents([.medium, .large, .height(100)], selection: $sheetDetentSelection)}}}
- Se define la variable de estado
sheetDetentSelectionpara conocer la altura seleccionada, por defecto esPresentationDetent.height(100). - Establece un sheet con tres alturas establecidas y asigna la variable
sheetDetentSelectional parámetroselection. Al presionar Change Size, se modifica la altura del botón a.medium.
Si quieres seguir aprendiendo más de sheets en SwiftUI, te recomiendo este artículo en nuestro blog para saber cómo bloquear sheets.