Я хочу знать, как этот эффект достигается в SwiftUI или UIKit. https://streamable.com/hvo8k7
Я провел несколько тестов, используя нижний лист SwiftUI:
var body: some View {
Button("Toggle") {
showingCredits.toggle()
}
.sheet(isPresented: $showing) {
Text("Test sheet")
.presentationDetents([.medium, .large])
}
}
«Откат назад» происходит только в том случае, если нижний лист достигает «большой» части презентации. Но у меня вопрос, как добиться этого «отката» на разных фиксаторах, но больших.





Это будет работать с небольшими листами презентации:
import SwiftUI
struct ContentView: View {
@State private var showingCredits = false
var body: some View {
VStack {
Spacer()
HStack {
Spacer()
Button("Toggle") {
showingCredits.toggle()
}
Spacer()
}
Spacer()
}
.customSheet(isPresented: $showingCredits) {
Text("Test sheet")
}
}
}
#Preview {
ContentView()
}
struct CustomSheet<Destination: View>: ViewModifier {
@Binding var isPresented: Bool
@ViewBuilder var destination: () -> Destination
@State private var scale: CGSize = CGSize(width: 1.0, height: 1.0)
@State private var cornerRadius: Double = 0.0
func body(content: Content) -> some View {
content
.background(.background)
.cornerRadius(cornerRadius)
.scaleEffect(scale)
.onChange(of: isPresented, { _, newValue in
withAnimation {
scale = newValue ? CGSize(width: 0.95, height: 0.95) : CGSize(width: 1.0, height: 1.0)
cornerRadius = newValue ? 15 : 0
}
})
.sheet(isPresented: $isPresented) {
destination()
.presentationDetents([.medium])
}
.background(.black)
}
}
extension View {
func customSheet<Destination: View>(isPresented: Binding<Bool>, @ViewBuilder destination: @escaping () -> Destination) -> some View {
modifier(CustomSheet(isPresented: isPresented, destination: destination))
}
}
@Gamekohl Это потому, что свойство isPresented изменяется после полного закрытия листа (т. е. удаления с экрана), что вызывает метод onChange. Вы можете проверить это, добавив кнопку внутри листа и заставив ее переключать свойство isPresented. Вы увидите, что вид вернется к исходному масштабу сразу после нажатия кнопки.
Можно ли было бы получить этот эффект, закрыв лист смахиванием?
@Gamekohl Конечно. Создав собственный лист, вы получите полный контроль над жестами перетаскивания.
Спасибо за ваше решение. Не могли бы вы объяснить, почему после закрытия листа и возврата к полному размеру происходит небольшая задержка?