我有一个第三方库组件的UIViewRepresentable FSCalendar。但是,我需要这个符合UIView类型.有办法这样做吗?如有任何帮助,我们将不胜感激:)
struct CalendarViewRepresentable: UIViewRepresentable {
typealias UIViewType = FSCalendar
var calendar = FSCalendar()
@Binding var selectedDate: Date
var calendarHeight: NSLayoutConstraint?
func updateUIView(_ uiView: FSCalendar, context: Context) { }
func makeUIView(context: Context) -> FSCalendar {
calendar.delegate = context.coordinator
calendar.dataSource = context.coordinator
calendar.translatesAutoresizingMaskIntoConstraints = false
calendar.setContentHuggingPriority(.required, for: .vertical)
calendar.setContentHuggingPriority(.required, for: .horizontal)
NSLayoutConstraint.activate([
calendar.topAnchor.constraint(equalTo: context.coordinator.topAnchor)
])
return calendar
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource {
var parent: CalendarViewRepresentable
init(_ parent: CalendarViewRepresentable) {
self.parent = parent
}
func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
parent.selectedDate = date
}
func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) {
parent.calendarHeight?.constant = bounds.height
parent.calendar.layoutIfNeeded()
}
}
}
struct HomeView: View {
@State private var selectedDate: Date = Date()
var body: some View {
VStack {
CalendarViewRepresentable(selectedDate: self.$selectedDate)
}
}
}发布于 2022-11-18 16:59:40
每当我们想要在UIKit上下文中使用该视图时,我们通常会将一个UIViewRepresentable视图(UIView)包装为UIViewRepresentable。SwiftUI使用一个名为View的视图元素。
在您的示例中,UIKit视图是FSCalendar,它最初是一个UIView,将其包装为UIViewRepresentable有助于我们将其作为SwiftUI视图在SwiftUI上下文中使用--因此没有理由将UIViewRepresentable转换为UIView。
发布于 2022-11-18 21:35:57
使用UIViewRepresentable实现Coordinator是不完全正确的,请尝试如下:
import SwiftUI
import FSCalendar
struct CalendarViewRepresentable: UIViewRepresentable {
@Binding var selectedDate: Date
func makeCoordinator() -> Coordinator {
Coordinator()
}
func makeUIView(context: Context) -> FSCalendar {
return context.coordinator.calendar
}
func updateUIView(_ uiView: FSCalendar, context: Context) {
uiView.select(selectedDate)
context.coordinator.didSelectDate = { date in
selectedDate = date
}
}
class Coordinator: NSObject, FSCalendarDelegate, FSCalendarDataSource {
lazy var calendar: FSCalendar = {
let calendar = FSCalendar()
calendar.delegate = self
calendar.dataSource = self
return calendar
}()
var didSelectDate: ((Date) -> ())?
func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
didSelectDate?(date)
}
}
}
struct FSCalendarTest: View {
@State private var selectedDate = Date()
var body: some View {
NavigationStack {
CalendarViewRepresentable(selectedDate: self.$selectedDate)
.navigationTitle("\(selectedDate, format: .dateTime)")
.toolbar {
Button("Now") {
selectedDate = Date()
}
}
}
}
}

https://stackoverflow.com/questions/74492958
复制相似问题