UICalendarView vs SwiftUI DatePicker неправильный размер в боковой панели NavigationSplitView

Поскольку мне нужно добавить значки к определенным датам, мне нужно использовать репрезентативное, однако при использовании этого вNavigationSplitViewбоковая панель, ширинаUICalendarViewневерно... в отличие от графического DatePicker, который должен быть одним и тем же компонентом, макет правильно

В области сведений макет такой же, проблема возникает с меньшим горизонтальным пространством.

Как это исправить?

      struct CalendarUI: UIViewRepresentable {
    
    let interval: DateInterval
    
    func makeUIView(context: Context) -> UICalendarView {
        let view = UICalendarView()
        view.calendar = Calendar.current
        view.availableDateRange = interval
        return view
    }
    
    func updateUIView(_ uiView: UICalendarView, context: Context) {
        
    }
    
}

struct SidebarUI: View {
    
    @State private var date = Date()
    
    var body: some View {
        VStack {
            CalendarUI(interval: DateInterval(start: .distantPast, end: .distantFuture))
                .fixedSize(horizontal: true, vertical: true)
            DatePicker(
                "Start Date",
                selection: $date,
                displayedComponents: [.date]
            )
            .datePickerStyle(.graphical)
        }.padding()
    }
}

1 ответ

У меня была та же проблема, что и у вас:UICalendarViewкогда завернут вUIViewRepresentableдля использования в SwiftUI не меняет свой размер должным образом и пытается занять всю ширину.

Для меня работает следующее решение: Вfunc makeUIView(context: Context) -> UICalendarViewдобавьте строки ниже:

      // Make sure our calendar view adapts nicely to size constraints.
view.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

Далее я изменил.fixedSizeмодификатор не применяется к горизонтальной оси!

      CalendarUI(interval: DateInterval(start: .distantPast, end: .distantFuture))
    .fixedSize(horizontal: false, vertical: true)
Другие вопросы по тегам