SwiftUI: Difference between revisions
Jump to navigation
Jump to search
Line 131: | Line 131: | ||
import FSCalendar | import FSCalendar | ||
class MyFSCalendarController: UIViewController { | class MyFSCalendarController: UIViewController, FSCalendarDelegateAppearance { | ||
let secondary: UIColor = ThemeColor.sharpOrange.uicolor | let secondary: UIColor = ThemeColor.sharpOrange.uicolor | ||
let primary: UIColor = ThemeColor.midnightBlue.uicolor | let primary: UIColor = ThemeColor.midnightBlue.uicolor | ||
let tersiary: UIColor = ThemeColor.whitishBlue.uicolor | let tersiary: UIColor = ThemeColor.whitishBlue.uicolor | ||
fileprivate | fileprivate let formatter: DateFormatter = { | ||
let formatter = DateFormatter() | let formatter = DateFormatter() | ||
formatter.dateFormat = "yyyy | formatter.dateFormat = "yyyy-MM-dd" | ||
return formatter | return formatter | ||
}() | }() | ||
fileprivate weak var calendar: FSCalendar! | |||
override func loadView() { | override func loadView() { | ||
Line 156: | Line 149: | ||
let view: UIView = .init(frame: frame) | let view: UIView = .init(frame: frame) | ||
self.view = view | self.view = view | ||
let calendar: FSCalendar = .init(frame: frame) | let calendar: FSCalendar = .init(frame: frame) | ||
calendar.allowsMultipleSelection = false | |||
calendar.dataSource = self | calendar.dataSource = self | ||
calendar.delegate = self | calendar.delegate = self | ||
view.addSubview(calendar) | view.addSubview(calendar) | ||
self.calendar = calendar | self.calendar = calendar | ||
calendar.calendarHeaderView.backgroundColor = self.primary | calendar.calendarHeaderView.backgroundColor = self.primary | ||
calendar.calendarWeekdayView.backgroundColor = self.primary | calendar.calendarWeekdayView.backgroundColor = self.primary | ||
calendar.appearance.headerTitleColor = self.tersiary | calendar.appearance.headerTitleColor = self.tersiary | ||
calendar.appearance.weekdayTextColor = self.tersiary | calendar.appearance.weekdayTextColor = self.tersiary | ||
calendar.appearance.eventSelectionColor = self.tersiary | calendar.appearance.eventSelectionColor = self.tersiary | ||
calendar.appearance.eventDefaultColor = self.primary | calendar.appearance.eventDefaultColor = self.primary | ||
calendar.appearance.eventOffset = CGPoint(x: 0, y: -7) | calendar.appearance.eventOffset = CGPoint(x: 0, y: -7) | ||
calendar.appearance.todaySelectionColor = self.primary | calendar.appearance.todaySelectionColor = self.primary | ||
calendar.appearance.selectionColor = self.secondary | calendar.appearance.selectionColor = self.secondary | ||
calendar.appearance.todayColor = self.primary | calendar.appearance.todayColor = self.primary | ||
calendar.appearance.titleWeekendColor = self.secondary | calendar.appearance.titleWeekendColor = self.secondary | ||
calendar.appearance.titleDefaultColor = self.primary | calendar.appearance.titleDefaultColor = self.primary | ||
calendar.swipeToChooseGesture.isEnabled = true | |||
let scopeGesture = UIPanGestureRecognizer(target: calendar, action: #selector(calendar.handleScopeGesture(_:))); | |||
scopeGesture.delegate = self | |||
calendar.addGestureRecognizer(scopeGesture) | |||
} | } | ||
override func viewDidLoad() { | override func viewDidLoad() { | ||
super.viewDidLoad() | super.viewDidLoad() | ||
self.calendar.scope = .month | self.calendar.scope = .month | ||
self.calendar.select(Date.init()) | |||
self.calendar.accessibilityIdentifier = "calendar" | |||
} | } | ||
} | } | ||
Line 192: | Line 190: | ||
extension MyFSCalendarController: FSCalendarDataSource { | extension MyFSCalendarController: FSCalendarDataSource { | ||
func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { | func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { | ||
debugPrint("did select date \(self.formatter.string(from: date))") | |||
let selectedDates = calendar.selectedDates.map({self.formatter.string(from: $0)}) | let selectedDates = calendar.selectedDates.map({self.formatter.string(from: $0)}) | ||
debugPrint("selected dates is \(selectedDates)") | |||
if monthPosition == .next || monthPosition == .previous { | if monthPosition == .next || monthPosition == .previous { | ||
calendar.setCurrentPage(date, animated: true) | calendar.setCurrentPage(date, animated: true) | ||
Line 203: | Line 201: | ||
extension MyFSCalendarController: FSCalendarDelegate { | extension MyFSCalendarController: FSCalendarDelegate { | ||
func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) { | func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) { | ||
self.calendar.frame.size.height = bounds.height | |||
self.view.layoutIfNeeded() | self.view.layoutIfNeeded() | ||
} | } | ||
Line 209: | Line 208: | ||
extension MyFSCalendarController: UIGestureRecognizerDelegate { | extension MyFSCalendarController: UIGestureRecognizerDelegate { | ||
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { | func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { | ||
return | debugPrint("UIGestureRecognizer") | ||
return true | |||
} | } | ||
} | } |
Revision as of 22:56, 16 May 2020
ContentView
import SwiftUI
struct ContentView: View {
var body: some View {
VStack(alignment: .leading) {
Text("Turtle Rock")
.font(.title)
HStack {
Text("Joshua Tree National Park")
.font(.subheadline)
Spacer()
Text("California")
.font(.subheadline)
}
}
.padding()
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
}
}
MyPDFView
// MARK: - MyPDFView
fileprivate struct MyPDFView: UIViewRepresentable {
@Binding var data: Data
func makeUIView(context: UIViewRepresentableContext<MyPDFView>) -> UIView {
let empty = UIView()
//guard let provider = CGDataProvider(data: self.data as CFData) else {return empty}
//guard let document = CGPDFDocument(provider) else {return empty}
guard let url = URL(string: "https://api.chorke.org/academia/api/v1.0/health/card/01890600.pdf") else {return empty}
guard let document = CGPDFDocument(url as CFURL) else {return empty}
guard let page = document.page(at: 1) else {return empty}
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let uiImage = renderer.image { ctx in
UIColor.white.set()
ctx.fill(pageRect)
ctx.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
ctx.cgContext.drawPDFPage(page)
}
let view = UIImageView(image: uiImage)
view.contentMode = .scaleAspectFill
return view
}
func updateUIView(_ view: UIView, context: UIViewRepresentableContext<MyPDFView>) {
// MARK: - TODO
}
}
MyKDCalendar
import SwiftUI
import KDCalendar
public struct MyKDCalendar: UIViewRepresentable {
var date: Date = .init()
public func makeUIView(context: Context) -> CalendarView {
let calendar: CalendarView = .init()
calendar.setDisplayDate(self.date, animated: false)
calendar.selectDate(self.date)
calendar.dataSource = self
calendar.delegate = self
return calendar;
}
public func updateUIView(_ calendar: CalendarView, context: Context) {
calendar.selectDate(self.date)
}
}
extension MyKDCalendar: CalendarViewDataSource {
public func startDate() -> Date {
return Date.init()
}
public func endDate() -> Date {
var month:DateComponents = .init()
month.month = 2
return Calendar.current.date(byAdding: month, to: Date.init())!
}
public func headerString(_ date: Date) -> String? {
return nil
}
}
extension MyKDCalendar: CalendarViewDelegate {
public func calendar(_ calendar: CalendarView, didDeselectDate date: Date) {}
public func calendar(_ calendar: CalendarView, didScrollToMonth date: Date) {}
public func calendar(_ calendar: CalendarView, didSelectDate date: Date, withEvents events: [CalendarEvent]) {}
public func calendar(_ calendar: CalendarView, didLongPressDate date: Date, withEvents events: [CalendarEvent]?) {}
public func calendar(_ calendar: CalendarView, canSelectDate date: Date) -> Bool {
return true
}
}
MyFSCalendar
import SwiftUI
import FSCalendar
struct MyFSCalendar: UIViewControllerRepresentable {
func makeUIViewController(context: UIViewControllerRepresentableContext<MyFSCalendar>) -> MyFSCalendarController {
let calendar: MyFSCalendarController = .init()
return calendar
}
func updateUIViewController(_ calendar: MyFSCalendarController, context: UIViewControllerRepresentableContext<MyFSCalendar>) {
// MARK: - TODO
}
}
import UIKit
import FSCalendar
class MyFSCalendarController: UIViewController, FSCalendarDelegateAppearance {
let secondary: UIColor = ThemeColor.sharpOrange.uicolor
let primary: UIColor = ThemeColor.midnightBlue.uicolor
let tersiary: UIColor = ThemeColor.whitishBlue.uicolor
fileprivate let formatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}()
fileprivate weak var calendar: FSCalendar!
override func loadView() {
let width: CGFloat = ThemeSettings.width - 40
let frame: CGRect = .init(x: 0, y: 0, width: width, height: 300)
let view: UIView = .init(frame: frame)
self.view = view
let calendar: FSCalendar = .init(frame: frame)
calendar.allowsMultipleSelection = false
calendar.dataSource = self
calendar.delegate = self
view.addSubview(calendar)
self.calendar = calendar
calendar.calendarHeaderView.backgroundColor = self.primary
calendar.calendarWeekdayView.backgroundColor = self.primary
calendar.appearance.headerTitleColor = self.tersiary
calendar.appearance.weekdayTextColor = self.tersiary
calendar.appearance.eventSelectionColor = self.tersiary
calendar.appearance.eventDefaultColor = self.primary
calendar.appearance.eventOffset = CGPoint(x: 0, y: -7)
calendar.appearance.todaySelectionColor = self.primary
calendar.appearance.selectionColor = self.secondary
calendar.appearance.todayColor = self.primary
calendar.appearance.titleWeekendColor = self.secondary
calendar.appearance.titleDefaultColor = self.primary
calendar.swipeToChooseGesture.isEnabled = true
let scopeGesture = UIPanGestureRecognizer(target: calendar, action: #selector(calendar.handleScopeGesture(_:)));
scopeGesture.delegate = self
calendar.addGestureRecognizer(scopeGesture)
}
override func viewDidLoad() {
super.viewDidLoad()
self.calendar.scope = .month
self.calendar.select(Date.init())
self.calendar.accessibilityIdentifier = "calendar"
}
}
extension MyFSCalendarController: FSCalendarDataSource {
func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
debugPrint("did select date \(self.formatter.string(from: date))")
let selectedDates = calendar.selectedDates.map({self.formatter.string(from: $0)})
debugPrint("selected dates is \(selectedDates)")
if monthPosition == .next || monthPosition == .previous {
calendar.setCurrentPage(date, animated: true)
}
}
}
extension MyFSCalendarController: FSCalendarDelegate {
func calendar(_ calendar: FSCalendar, boundingRectWillChange bounds: CGRect, animated: Bool) {
self.calendar.frame.size.height = bounds.height
self.view.layoutIfNeeded()
}
}
extension MyFSCalendarController: UIGestureRecognizerDelegate {
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
debugPrint("UIGestureRecognizer")
return true
}
}