Presentar un formulario sobre otra pantalla suele resolverse con .sheet. Sin embargo, cuando la pantalla tiene espacio para mostrar la presentación y parte del contenido original, su posición también influye en la experiencia. Un editor situado a un lado puede dejar visible información que necesitamos consultar mientras trabajamos.
SwiftUI incorpora desde iOS 27 el modificador .presentationPlacement(_:) para indicar dónde queremos colocar esa presentación. En iPhone Duo, la elección resulta especialmente visible al utilizar la pantalla interior.
Una preferencia dentro de la presentación
El modificador se aplica al contenido del bloque de .sheet, igual que otras opciones de configuración de la presentación. Aplicarlo al botón que abre el formulario no expresa la misma configuración.
El tipo PresentationPlacement ofrece cuatro valores:
.automatic: el sistema decide; es el comportamiento predeterminado..center: solicita una posición centrada..leading: solicita el borde inicial..trailing: solicita el borde final.
Los bordes inicial y final son conceptos relativos a la dirección de lectura. En una interfaz en español corresponden a izquierda y derecha, respectivamente; conviene conservar esos nombres al razonar sobre interfaces traducidas.
Apple especifica que solo las presentaciones de tipo sheet respetan esta configuración. No debemos interpretar el nombre del modificador como una opción general para recolocar alertas o cualquier otra presentación.
Un editor de notas como ejemplo
Imaginemos una aplicación que permite añadir una anotación mientras consultamos un documento. Podemos solicitar que el editor aparezca en el borde final, manteniendo la presentación habitual en sistemas anteriores:
import SwiftUI
struct DocumentView: View {
@State private var showsNoteEditor = false
var body: some View {
Button("Añadir anotación", systemImage: "square.and.pencil") {
showsNoteEditor = true
}
.sheet(isPresented: $showsNoteEditor) {
if #available(iOS 27.0, *) {
NoteEditor()
.presentationPlacement(.trailing)
} else {
NoteEditor()
}
}
}
}
private struct NoteEditor: View {
@Environment(\.dismiss) private var dismiss
@State private var text = ""
var body: some View {
NavigationStack {
Form {
TextField("Anotación", text: $text, axis: .vertical)
}
.navigationTitle("Nueva anotación")
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cerrar", systemImage: "xmark") {
dismiss()
}
}
}
}
}
}
El ejemplo se centra en la presentación y el cierre del editor; una aplicación real conectaría el texto con su modelo para guardar la anotación. El control de disponibilidad permite conservar un mínimo de iOS anterior, aunque necesitamos compilar con un SDK que conozca la nueva API.
El pliegue tiene prioridad
Con el dispositivo completamente abierto, la presentación de la vista modal puede situarse en el centro o en uno de los extremos. Al plegarlo parcialmente, el sistema evita colocarla sobre el pliegue.
Cuando se pliega, .center acaba ocupando la mitad izquierda, igual que .automatic y .leading; .trailing utiliza la derecha. Pedir el centro no obliga al sistema a atravesar el pliegue.
En la pantalla exterior y en los iPhone convencionales, cambiar la preferencia no produce una diferencia visible porque la presentación ocupa el ancho disponible. No hace falta identificar el modelo del dispositivo para aplicar el modificador.
También cambia la barra de herramientas
Apple explica en su guía de adaptación a iPhone Duo que las vistas modales de la pantalla interior presentan sus barras horizontalmente cuando están centradas o en el borde inicial, y verticalmente cuando están en el borde final.
Por eso, elegir .trailing también afecta a cómo se presentan las acciones. Es preferible utilizar NavigationStack y posiciones semánticas de ToolbarItem, como .cancellationAction, para que el sistema gestione su adaptación.
Además, Apple recomienda proporcionar título e icono: los elementos presentados verticalmente usan el icono, mientras que otros contextos pueden mostrar el título. Un botón compuesto únicamente por texto limita esa adaptación.
El equivalente en UIKit
UIKit ofrece preferredPlacement en UISheetPresentationController, también desde iOS 27. Si ya tenemos preparado el controlador del editor:
let navigation = UINavigationController(rootViewController: editor)
navigation.modalPresentationStyle = .pageSheet
if #available(iOS 27.0, *) {
navigation.sheetPresentationController?.preferredPlacement = .trailing
}
present(navigation, animated: true)
La posición automática sigue siendo un buen punto de partida. Conviene elegir un borde cuando ayuda a consultar el contenido de fondo o encaja mejor con las acciones de la pantalla. Después, debemos revisar la presentación con el dispositivo abierto, parcialmente plegado y cerrado: la preferencia expresa nuestra intención, y el sistema la adapta al espacio disponible.