Нижний лист iOS с фиксаторами дробей UIKit

Я хотел бы открыть нижний лист с настраиваемой опцией, а не со средними или большими фиксаторами. Я проверил в SwiftUI, что есть API под названием .fraction, но не смог найти аналогичный API в UIKit.

SwiftUI

Text("Detail")
    .presentationDetents([.fraction(0.1)])

УИКит

if let sheet = viewControllerToPresent.sheetPresentationController {
               sheet.detents = [.medium()]
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я проверил базовую 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
                           }
                   ]

Другие вопросы по теме

`LongPressGesture` не регистрируется на iOS 18
Swift 6: Ошибка: невозможно отправить изолированное значение задачи или актера
Странная ошибка: «Невозможно сформировать ключевой путь к основному свойству, изолированному актером…» в параллелизме Swift
Как добавить статические функции, использующие задачи, в расширениях Swift Task
Swift async/await реализует обновление с использованием задачи
Проблема бесконечного цикла со статическими операторами в расширениях Swift (цели обучения)
Формирование «UnsafeRawPointer» для переменной типа «[T]»; это, скорее всего, неверно, поскольку «T» может содержать ссылку на объект
Как показать строку текста массива в форме кривой в SwiftUI?
Замыкания в актерах: отправка «nonSendable» рискует вызвать гонку данных
Передача аргумента неотправляемого типа '(любой URLSessionTaskDelegate)?' вне основного контекста, изолированного от актера, может возникнуть гонка данных

Похожие вопросы