在 UISheetPresentationController 中自定义较小的 Detents?

问题描述 投票:0回答:5

Apple 终于在 2021 年的 iOS 15 中发布了一个Apple Maps-style“bottom sheet”控件:UISheetPresentationController.

这种类型的床单本身支持“制动器”,床单自然放置的高度。默认的

large()
制动器代表全屏演示文稿,而
medium()
制动器覆盖大约一半的屏幕。

但是API里面没有

small()
的detent。

Apple Maps 和类似的应用程序通常会在屏幕底部显示一个完全折叠的小表格,可以将其拖动到半高,也可以将其拖动到全屏。苹果地图实际上显示了 1/3 高度的屏幕,这似乎与

medium()
制动器不同。

使用

UISheetPresentationController
not 任何底部表单的第 3 方重新实现,表单如何在屏幕底部呈现 Apple Maps 样式的折叠小制动器?

ios uiviewcontroller uikit bottom-sheet uipresentationcontroller
5个回答
21
投票

适用于 iOS 16+


对于 iOS 15:使用

+[UISheetPresentationControllerDetent _detentWithIdentifier:constant:]
.

是私有方法

样品

 Summary: UIKitCore`+[UISheetPresentationControllerDetent _detentWithIdentifier:constant:]        Address: UIKitCore[0x00000001838d50fc] (UIKitCore.__TEXT.__text + 17876312)

14
投票

我提交雷达请求支持。我建议其他任何想看到这个的人也这样做。实际上,中型和大型不会削减它,如果在 iOS 15 发布之前没有添加第三方库,我们将仍然依赖第三方库。


2
投票

在 UIKit 中 - iOS 16+ 分数定位器可以这样实现:

viewControllerToShow.modalPresentationStyle = .formSheet    
let sheet = viewControllerToShow.sheetPresentationController
let multiplier = 0.25    
let fraction = UISheetPresentationController.Detent.custom { context in 
    // height is the view.frame.height of the view controller which presents this bottom sheet
    height * multiplier
}
sheet?.detents = [fraction]

1
投票

SwiftUI - iOS 16+

您可以使用类似的东西添加自己的自定义制动器尺寸:

.sheet(isPresented: $showSheet) {
    YourView()
        .presentationDetents([.large, .medium, .fraction(0.25)]) //Fraction 0.25 means the sheet will be sized 25% of the whole screen.
}

0
投票
id detent = [UISheetPresentationControllerDetent customDetentWithIdentifier:UISheetPresentationControllerDetentIdentifierLarge
                                                                   resolver:^CGFloat(id<UISheetPresentationControllerDetentResolutionContext>  _Nonnull context) {
    return 150;
}];
© www.soinside.com 2019 - 2024. All rights reserved.