Я хотел бы открыть нижний лист с настраиваемой опцией, а не со средними или большими фиксаторами. Я проверил в SwiftUI, что есть API под названием .fraction, но не смог найти аналогичный API в UIKit.
SwiftUI
Text("Detail")
.presentationDetents([.fraction(0.1)])
УИКит
if let sheet = viewControllerToPresent.sheetPresentationController {
sheet.detents = [.medium()]
Я проверил базовую UISheetPresentationController
SwiftUI sheet
на iOS 17.4 и увидел, что фиксаторы имеют тип «пользовательского».
import SwiftUIIntrospect
struct ContentView: View {
var body: some View {
Text("Foo")
.sheet(isPresented: .constant(true)) {
Text("Sheet")
.presentationDetents([.height(100), .fraction(0.5)])
.introspect(.sheet, on: .iOS(.v17)) { x in
print((x as! UISheetPresentationController).detents)
}
}
}
}
/*
Output:
[<UISheetPresentationControllerDetent: 0x600000c62610: _type=custom, _identifier=Fraction:0.5>, <UISheetPresentationControllerDetent: 0x600000c626a0: _type=custom, _identifier=Height:100.0>]
*/
Это говорит о том, что .fraction(...)
и .height(...)
в SwiftUI просто создают фиксаторы UIKit, используя фабричный метод .custom. С другой стороны, .medium
и .large
в SwiftUI соответствуют .medium()
и .large()
в UIKit.
Вот расширение UISheetPresentationController.Detent
, которое добавляет фабричный метод fraction
:
extension UISheetPresentationController.Detent {
static func fraction(_ value: CGFloat) -> UISheetPresentationController.Detent {
.custom(identifier: Identifier("Fraction:\(value)")) { context in
context.maximumDetentValue * value
}
}
}
Спасибо, я также нашел еще один способ сделать это.
sheet.detents = [
.custom { context in
return context.maximumDetentValue * 0.25
}
]