A most fully customization calendar for Apple platforms 📅

Overview

CI Status Version Carthage SwiftPM compatible Platform License

KVKCalendar

KVKCalendar is a most fully customization calendar. Library consists of five modules for displaying various types of calendar (day, week, month, year, list of events). You can choose any module or use all. It is designed based on a standard iOS calendar, but with additional features. Timeline displays the schedule for the day and the week.

Additional features:

Need Help?

If you have a question about how to use KVKCalendar in your application, ask it on StackOverflow using the KVKCalendar tag.

Please, use Issues only for reporting bugs or requesting a new features in the library.

Requirements

  • iOS 10.0+, iPadOS 10.0+, MacOS 11.0+ (supports Mac Catalyst)
  • Swift 5.0+

Installation

KVKCalendar is available through CocoaPods or Carthage or Swift Package Manager.

CocoaPods

pod 'KVKCalendar'

Adding Pods to an Xcode project

Carthage

github "kvyatkovskys/KVKCalendar"

Adding Frameworks to an Xcode project

Swift Package Manager (Xcode 12 or higher)

  1. In Xcode navigate to FileSwift PackagesAdd Package Dependency...
  2. Select a project
  3. Paste the repository URL (https://github.com/kvyatkovskys/KVKCalendar.git) and click Next.
  4. For Rules, select Version (Up to Next Major) and click Next.
  5. Click Finish.

Adding Package Dependencies to Your App

Usage for UIKit

Import KVKCalendar. Create a subclass view CalendarView and implement CalendarDataSource protocol. Create an array of class [Event] and return the array.

import KVKCalendar

class ViewController: UIViewController {
    var events = [Event]()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let calendar = CalendarView(frame: frame)
        calendar.dataSource = self
        view.addSubview(calendar)
        
        createEvents { (events) in
            self.events = events
            self.calendarView.reloadData()
        }
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        // to track changing frame when an user rotates device
        calendarView.reloadFrame(view.frame)
    }
}

extension ViewController {
    func createEvents(completion: ([Event]) -> Void) {
        let models = // Get events from storage / API
        
        let events = models.compactMap({ (item) in
            var event = Event(ID: item.id)
            event.start = item.startDate // start date event
            event.end = item.endDate // end date event
            event.color = item.color
            event.isAllDay = item.allDay
            event.isContainsFile = !item.files.isEmpty
            event.recurringType = // recurring event type - .everyDay, .everyWeek
        
            // Add text event (title, info, location, time)
            if item.allDay {
                event.text = "\(item.title)"
            } else {
                event.text = "\(startTime) - \(endTime)\n\(item.title)"
            }
            return event
        })
        completion(events)
    }
}

extension ViewController: CalendarDataSource {
    func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
        // if you want to get events from iOS calendars
        // set calendar names to style.systemCalendars = ["Test"]
        let mappedEvents = systemEvents.compactMap { Event(event: $0) }
        return events + mappedEvents
    }
}

Implement CalendarDelegate to handle user action and control calendar behaviour.

calendar.delegate = self

To use a custom view for specific event or date you need to create a new view of class EventViewGeneral and return the view in function.

class CustomViewEvent: EventViewGeneral {
    override init(style: Style, event: Event, frame: CGRect) {
        super.init(style: style, event: event, frame: frame)
    }
}

// an optional function from CalendarDataSource
func willDisplayEventView(_ event: Event, frame: CGRect, date: Date?) -> EventViewGeneral? {
    guard event.ID == id else { return nil }
    
    return customEventView
}

To use a custom date cell, just subscribe on this optional method from CalendarDataSource (works for Day/Week/Month/Year views).

func dequeueCell<T>(parameter: CellParameter, type: CalendarType, view: T, indexPath: IndexPath) -> KVKCalendarCellProtocol? where T: UIScrollView { 
    switch type {
    case .year:
        let cell = (view as? UICollectionView)?.dequeueCell(indexPath: indexPath) { (cell: CustomYearCell) in
            // configure the cell
        }
        return cell
    case .day, .week, .month:    
        let cell = (view as? UICollectionView)?.dequeueCell(indexPath: indexPath) { (cell: CustomDayCell) in
            // configure the cell
        }
        return cell
    case .list:    
        let cell = (view as? UITableView)?.dequeueCell { (cell: CustomListCell) in
            // configure the cell
        }
        return cell
    }
}

Usage for SwiftUI

Add a new SwiftUI file and import KVKCalendar. Create a struct CalendarDisplayView and declare the protocol UIViewRepresentable for connection UIKit with SwiftUI.

import SwiftUI
import KVKCalendar

struct CalendarDisplayView: UIViewRepresentable {
    @Binding var events: [Event]

    private var calendar: CalendarView = {
        return CalendarView(frame: frame, style: style)
    }()
        
    func makeUIView(context: UIViewRepresentableContext<CalendarDisplayView>) -> CalendarView {
        calendar.dataSource = context.coordinator
        calendar.delegate = context.coordinator
        return calendar
    }
    
    func updateUIView(_ uiView: CalendarView, context: UIViewRepresentableContext<CalendarDisplayView>) {
        context.coordinator.events = events
    }
    
    func makeCoordinator() -> CalendarDisplayView.Coordinator {
        Coordinator(self)
    }
    
    public init(events: Binding<[Event]>) {
        self._events = events
    }
    
    // MARK: Calendar DataSource and Delegate
    class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
        private let view: CalendarDisplayView
        
        var events: [Event] = [] {
            didSet {
                view.calendar.reloadData()
            }
        }
        
        init(_ view: CalendarDisplayView) {
            self.view = view
            super.init()
        }
        
        func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
            return events
        }
    }
}

Create a new SwiftUI file and add CalendarDisplayView to body.

import SwiftUI

struct CalendarContentView: View {
    @State var events: [Event] = []

    var body: some View {
        NavigationView {
            CalendarDisplayView(events: $events)
        }
    }
}

Styles

To customize calendar create an object Style and add to init class CalendarView.

public struct Style {
    public var event = EventStyle()
    public var timeline = TimelineStyle()
    public var week = WeekStyle()
    public var allDay = AllDayStyle()
    public var headerScroll = HeaderScrollStyle()
    public var month = MonthStyle()
    public var year = YearStyle()
    public var list = ListViewStyle()
    public var locale = Locale.current
    public var calendar = Calendar.current
    public var timezone = TimeZone.current
    public var defaultType: CalendarType?
    public var timeHourSystem: TimeHourSystem = .twentyFourHour
    public var startWeekDay: StartDayType = .monday
    public var followInSystemTheme: Bool = false 
    public var systemCalendars: Set<String> = []
}

Author

Sergei Kviatkovskii

License

KVKCalendar is available under the MIT license

Comments
  • Month event is not getting loaded until select the month date

    Month event is not getting loaded until select the month date

    Month event is not getting loaded until select the month date. By default selected date, month events are displayed whereas when I scroll to next or previous month, events are not showing in Month.

    added style.month.autoSelectionDateWhenScrolling = true

    Expected behavior When I scroll, events should be displayed every month

    IMG_0042| IMG_0043 IMG_0044

    https://user-images.githubusercontent.com/15062050/160773616-07421f4e-a33b-40b6-9f40-d3e7d9de7448.MP4

    Here April 2022 month events are not getting displayed in the month view, after selecting any date on April month events is displayed.

    bug 
    opened by sabarics 19
  • updateUIView doesn't trigger loading of new events in SwiftUI and other SwiftUI-UIKit-interface issues

    updateUIView doesn't trigger loading of new events in SwiftUI and other SwiftUI-UIKit-interface issues

    I want the calendar to be updated when new elements are saved in the array courses: i.e. the events of the new element have to be displayed in the calendar in week-view. At the moment only closing the app after adding elements to courses triggers the new events to load. With the print statements I controlled that all data is constantly up to date (thanks to the @Binding) and found that a change in courses correctly triggers updateUIView to be called but actually nothing changes in the calendar. Is my implementation incorrect? Or should actually work an the problem is not from my side? Any comment and suggestion is very much appreciated.

    Code:

    import SwiftUI
    import KVKCalendar
    import EventKit
    
    struct CalendarRepresentable: UIViewRepresentable{
        @Binding var courses: [Courses]
    
        var events = [Event]()
    
        var calendar: CalendarView = {
            print("- calendar begins initialization")
            var style = Style()
            style.defaultType = .week
            //...
            //... other style settings
            //...
            if #available(iOS 13.0, *) {
                style.event.iconFile = UIImage(systemName: "paperclip")
            }
            print("- calendar ends initialization")
            return CalendarView(frame: UIScreen.main.bounds, style: style)
    
        }()
    
    
        func updateUIView(_ uiView: CalendarView, context: Context ){
            print("- updateUIView has been called. Events has \(events.count) elements. Courses has \(courses.count) elements.")
    
            context.coordinator.parent = self
            context.coordinator.courses = courses
    
            print("- calling calendar.dataSource = context.coordinator in update")
            calendar.dataSource = context.coordinator
            print("- calling calendar.delegate = context.coordinator in update")
            calendar.delegate = context.coordinator
    
            print("- calling reloadData in update ")
            calendar.reloadData()
            print("- calling reloadInputViews in update")
            calendar.reloadInputViews()
    
            print("- updateUIView is finished")
    
        }
    
    
        func makeUIView(context: Context) -> CalendarView {
            print("- makeUIView has been called")
            print("- calling calendar.dataSource = context.coordinator in make")
            calendar.dataSource = context.coordinator
            print("- calling calendar.delegate = context.coordinator in make")
            calendar.delegate = context.coordinator
            print("- calling reloadData in make")
            calendar.reloadData()
            print("- end of makeuiview")
            return calendar
        }
    
    
        func makeCoordinator() -> Coordinator {
            print("- makeCoordinator ")
            return Coordinator(self, courses)
        }
    
    
        class Coordinator: NSObject, CalendarDelegate, CalendarDataSource, UINavigationControllerDelegate {
            var events = [Event]()
            var parent: CalendarRepresentable
            var courses: [Courses]
    
            func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
                print("- eventsForCalendar called. In Coordinator \(events.count) events and \(self.parent.courses.count) courses. Coordinator courses has \(courses.count).")
                loadEvents { (events) in
                    self.events = events
                }
                print("- after eventsForCalendar: \(events.count) events")
                return self.events
            }
    
            init(_ parent: CalendarRepresentable, _ courses: [Courses]){
                print("- Initialize Coordinator")
                self.parent = parent
                self.courses = courses
                super.init()
    
                loadEvents { (events) in
                    self.events = events
                    self.parent.calendar.reloadData()
                }
                print("- End of Initializer Coordinator")
            }
    
            func eventsForCalendar() -> [Event] {
                print("- eventsForCalendar without parameter")
                return events
            }
    
    
            func loadEvents(completion: ([Event]) -> Void) {
    
                var events = [Event]()
    
                print("- loadEvents with courses having \(self.parent.courses.count) elements")
    
                var i: Int=0
                for course in courses {
    
                    let isoDateStart = course.startEvent
                    let dateStartFormatter = ISO8601DateFormatter()
    
                    let isoDateEnd = course.endEvent
                    let dateEndFormatter = ISO8601DateFormatter()
                    var event = Event(ID: "\(i)")
    
                    event.start = dateStartFormatter.date(from: isoDateStart)!
                    event.end = dateEndFormatter.date(from: isoDateEnd)!
                    event.text = course.name
    
                    events.append(event)
    
                    i=i+1
                }
    
                completion(events)
            }
    
        }
    
    }
    
    bug 
    opened by graldij 17
  • Events filter not functioning properly in month view

    Events filter not functioning properly in month view

    I have search functionality in all views(day, week, month, and list). In month view when I search for 1st time, it's working properly whereas when I search the second time it shows 1st time search events and also 2Nd time search events. This is repeated for every search, events seem to be added for every search.

    In List, Week, and Day view working fine.

    bug 
    opened by sabarics 13
  • How can show all day events in List?

    How can show all day events in List?

    Is there any way to show all day events in List? For Example - If I have event for one week 16th may - 22nd May, I want to show events in all days(16-22).

    bug 
    opened by sabarics 13
  • negative sizes are not supported in the flow layout

    negative sizes are not supported in the flow layout

    Describe the bug Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'negative sizes are not supported in the flow layout' after updating pod

    To Reproduce Steps to reproduce the behavior:

    1. Go to Month View which I have created
    2. See error

    Expected behavior Normal Month view seen as per old version 0.4.1.

    bug 
    opened by learnasucan 12
  • Missing vertical lines at week view

    Missing vertical lines at week view

    To Reproduce

    1. Create new project (SwiftUI)
    2. Add package (using Swift Package Manager)
    3. Use sample code from README
    4. Style settings for CalendarView
        private var calendar: CalendarView = {
            var style = Style()
            style.defaultType = .week
            style.timeSystem = .twentyFour
    
            return CalendarView(frame: UIScreen.main.bounds, style: style)
        }()
    

    Steps to reproduce the behavior:

    1. Slide between weeks

    Expected behavior Show vertical lines at every week.

    Screenshots Screen-Recording-2022-11-07-at-12 36 22

    bug investigation 
    opened by AentZ-eu 9
  • How to hide Header

    How to hide Header

    Hi @kvyatkovskys ,

    Can we hide the header view, if yes where should i be looking to make those changes. I want only the events part to be visible, as I'm planning to show events for only one day.

    Screenshot 2020-07-24 at 3 27 28 PM

    enhancement 
    opened by harshith30 9
  • Is it possible to make a List View?

    Is it possible to make a List View?

    First of all thank you for such a great plugin. I need to make a list view like a UITableView tab next to month tab. I will really appreciate the help or at least the guidance on how to do that.

    enhancement question 
    opened by jamal-pasha 9
  • Attempted to read an unowned reference but the object was already deallocated

    Attempted to read an unowned reference but the object was already deallocated

    I use your component in a NavigationView page detail. When I go back into list and the minute changes, the component still call movingCurrentLineHour throwing 'Fatal error: Attempted to read an unowned reference but the object was already deallocated' in TimelineView:282. How can I catch this? It is possible to fix or did I do something wrong?

    bug 
    opened by teonji 9
  • Week-view does not scrolling to bottom

    Week-view does not scrolling to bottom

    Week-view does not scroll to the bottom if have more the 15 events.

    Step to reproduce My events list { "data": [ { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "401", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 1", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "402", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 2", "files": [] } ,{ "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "403", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 3", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "404", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 4", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "405", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 5", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "406", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 6", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "407", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 7", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "408", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 8", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "409", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 9", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "410", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 10", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "411", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 11", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "412", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 12", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "413", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 13", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "414", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 14", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "415", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 15", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "416", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 16", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "417", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 17", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "418", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 18", "files": [] }, { "all_day": 0, "border_color": "#FFFFFF", "color": "#12c795", "end": "2022-06-02T09:00:00+03:00", "id": "419", "start": "2022-06-02T08:30:00+03:00", "text_color": "#000000", "title": "All day event number 19", "files": [] } ] }

    Screenshot

    bug 
    opened by sabarics 8
  • How can i display System Events using SwiftUI?

    How can i display System Events using SwiftUI?

    Hi, at the moment, i am using the following code to use KVKCalendar in SwiftUI. It works, but how can i display System Events, coming from Eventkit? My code looks like this:

    struct CalendarDisplayView: UIViewRepresentable {
        @Binding var events: [Event]
        var type: CalendarType
        typealias UIViewType = CalendarView
        
        private var calendar: CalendarView = {
            var style = Style()
            style.headerScroll.heightHeaderWeek = 70
            return CalendarView(frame: UIScreen.main.bounds, style: style)
        }()
        
        func makeUIView(context: UIViewRepresentableContext<CalendarDisplayView>) -> CalendarView {
            calendar.dataSource = context.coordinator
            calendar.delegate = context.coordinator
            calendar.set(type: type)
            calendar.reloadData()
            return calendar
        }
        
        func updateUIView(_ uiView: CalendarView, context: Context) {
            
        }
        
        func makeCoordinator() -> CalendarDisplayView.Coordinator {
            Coordinator(self)
        }
        
        public init(events: Binding<[Event]>, type: CalendarType) {
            self._events = events
            self.type = type
        }
        
        class Coordinator: NSObject, CalendarDataSource, CalendarDelegate {
            private let view: CalendarDisplayView
            
            var events: [Event] = [] {
                didSet {
                    view.calendar.reloadData()
                }
            }
            
            init(_ view: CalendarDisplayView) {
                self.view = view
                super.init()
            }
            
            func eventsForCalendar(systemEvents: [EKEvent]) -> [Event] {
                return events
            }
        }
    }
    

    I am using the CalendarDisplayView in SwiftUI like this:

    struct ContentView: View {
        @StateObject var eventKitWrapper = Shift.shared
        @State var events: [Event] = []
        
        var body: some View {
            NavigationView {
                CalendarDisplayView(events: $events, type: .day)
                    .navigationBarTitle("Calendar", displayMode: .inline)
                    .onAppear {
                        eventKitWrapper.fetchEventsForToday() { result in
                            switch result {
                            case let .success(events): print(events) // got events
                            case let .failure(error): print(error) // handle error
                            }
                        }
                    }
            }
        }
    }
    

    To get the System Events, i am using an Eventkit wrapper called Shift. It works, i get the events, but how can i display them in my CalendarDisplayView? What do i need to change or add to display the events in my calendar?

    Note: sorry, actually I wanted to ask the question as it says in the readme, on stackoverflow, but unfortunately I am not able to create the tag KVKCalendar.

    opened by niklasgrewe 8
  • what is year in KVKCalendarView init?

    what is year in KVKCalendarView init?

    Hi, I want to know the significance of the new parameter "year", and why it is not optional.

    public init(frame: CGRect, date: Date? = nil, style: Style = Style(), years: Int = 4)

    What should I pass for year parameter?

    Best regards, Sami

    opened by samulla 0
  • Trying to add overlay in SwiftUI

    Trying to add overlay in SwiftUI

    I'm trying to add something like CurrentLineView to display other information like Sunrise and Sunset, but I can't access the scroll position or something similar to calculate its position. Do you have an idea how I can do this? Here is my code to explain what I'm trying to do:

    struct CalendarContentView: View {
        @ObservedObject var viewModel: CalendarViewModel = CalendarViewModel()
        @State var test: String = "test"
        
        var body: some View {
            GeometryReader { geo in
                CalendarDisplayView(events: $viewModel.events, geo: geo, test: $test)
                    .overlay {
                        ZStack {
                            Text("Sunrise 6:35 AM")
                                .position(x: 110, y: geo.size.height / 2 - 12)
                                .foregroundColor(Color.blue)
                            Path() { path in
                                path.move(to: CGPoint(x: 44, y:  geo.size.height / 2 - 1))
                                path.addLine(to: CGPoint(x: 44, y:  geo.size.height / 2))
                                path.addLine(to: CGPoint(x: geo.size.width, y:  geo.size.height / 2))
                                path.addLine(to: CGPoint(x: geo.size.width, y:  geo.size.height / 2 - 1))
                            }.fill(Color.blue)
                        }
                    }
            }
        }
    }
    

    simulator

    enhancement 
    opened by dosht 1
  • How to get month name in month view?

    How to get month name in month view?

    I have few questions regarding Month View setup.

    1. How to know month name when we scrolled horizontally with paging enable and how to get update about the month change?
    2. Can we have both vertical and horizontal separator in month view?
    3. How to show stripes instead of dots for events?
    4. Can we configure selection that is of square only rather than circle?
    opened by BhavinBhadani 7
  • Lazy Loading of agenda view

    Lazy Loading of agenda view

    Hi @kvyatkovskys

    i am trying to load more than 500 events on listview . but it is taking time to show on UI Side .

    is there any way by which we can make it in chunks or like lazy loading of events .

    At one time it will load only 20-30 records . so The response time for loading list should be less.

    Thanks & Regards Krishan vir Singh

    enhancement 
    opened by virkrishna786 2
  • zoom inside WeekView

    zoom inside WeekView

    zoom inside WeekView performance is really slow ! I saw the code and I see that when we pinch we remove all the subviews inside the scrollview and make the whole events again ! any leads to where I could fix this?

    enhancement 
    opened by abdulahadfolio 1
Releases(0.6.13)
Owner
Kviatkovskii Sergei
iOS developer
Kviatkovskii Sergei
MetricTime is designed to be one universal timekeeping system that eliminates the hassle of calculating time since most of its convertions as simple as converting meters to centimeters

MetricTime MetricTime is designed to be one universal timekeeping system that eliminates the hassle of calculating time since most of its convertions

Adrian Edwards 4 Feb 10, 2022
Backports the new @Invalidating property wrapper to older platforms

ViewInvalidating A property wrapper that backports the new @Invalidating property wrapper to older versions of iOS/tvOS/macOS. For more information on

Suyash Srijan 61 Nov 23, 2022
Recreating a fully functional version of iOS 4 in SwiftUI.

Updates: Version 1.0 is currently available ?? While I work on fixing an issue in Xcode 12.5+ with LazyVGrid, I recommend you build using Xcode 12.4 a

null 2.9k Jan 1, 2023
SwiftUI library to create fully customizable input stepper.

SwiftUI-InputStepper Swift package for creating numerical input stepper. An example of input stepper created with this library It supports long press

Mateusz Budnik 4 Nov 2, 2022
Google ProtocolBuffers for Apple Swift

Protocol Buffers for Swift An implementation of Protocol Buffers in Swift. Protocol Buffers are a way of encoding structured data in an efficient yet

Alexey Khokhlov 933 Nov 4, 2022
Software Dummy Display Adapter for Apple Silicon Macs to Have Custom HiDPI Resolutions.

BetterDummy Dummy Display for Apple Silicon Macs to achieve custom resolutions. About M1 macs tend to have issues with custom resolutions. Notoriously

Istvan T. 8k Jan 9, 2023
DDC Library for Apple Silicon Macs

AppleSiliconDDC DDC Library for Apple Silicon Macs Usage Upcoming... For sample implementation take a look at the source code of MonitorControl (as Ar

Istvan T. 7 Oct 7, 2022
an Apple Watch® BINGO number generator app with histogram and history.

B4-BINGO-Number-Generator an Apple Watch® BINGO number generator app with histogram and history. This is a basic app using the Apple Watch which displ

Thomas Cavalli 1 Dec 7, 2021
Ecolande - Application realisé pendant l'Apple foundation Program.

Ecolande Application realisé pendant l'Apple foundation Program. Ecoland est l'application qui a été réalisé pendant l'Apple Foundation Program. Nous

Bilal Larose 1 Dec 31, 2021
Minecraft-silicon - Generate Apple Silicon-native versions of Minecraft

Minecraft Silicon A dead simple utility to generate Apple Silicon-native Minecra

Cole Feuer 4 Jun 21, 2022
A tool to convert Apple PencilKit data to Scribble Proto3.

ScribbleConverter Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements Installation

Paul Han 1 Aug 1, 2022
The Unofficial Apple iOS Swift Calendar View. Swift calendar Library. iOS calendar Control. 100% Customizable

Q: How will my calendar dateCells look with this library? A: However you want them to look. More Images Features Range selection - select dates in a r

PatchTheCode 7.3k Jan 2, 2023
RCalendarPicker A date picker control, Calendar calendar control, select control, calendar, date selection, the clock selection control.

RCalendarPicker RCalendarPicker Calendar calendar control, select control, calendar, date selection, the clock selection control. 日历控件 ,日历选择控件,日历,日期选择

杜耀辉 131 Jul 18, 2022
A declarative, performant, iOS calendar UI component that supports use cases ranging from simple date pickers all the way up to fully-featured calendar apps.

HorizonCalendar A declarative, performant, calendar UI component that supports use cases ranging from simple date pickers all the way up to fully-feat

Airbnb 2.2k Jan 4, 2023
An open source calendar framework for iOS, with support for customization, IBDesignable, Autolayout, and more.

About MBCalendarKit is a calendar control written in Objective-C with modern best practices and Swift interoperability in mind. It offers a flexible c

Moshe 563 Oct 27, 2022
Awesome-swift-platforms - A curated list of Swift on different platforms

Embedded Swift A curated list of Swift on different platforms. Nintendo Switch S

Devran Cosmo Uenal 4 Feb 6, 2022
XLForm is the most flexible and powerful iOS library to create dynamic table-view forms. Fully compatible with Swift & Obj-C.

XLForm By XMARTLABS. If you are working in Swift then you should have a look at Eureka, a complete re-design of XLForm in Swift and with more features

xmartlabs 5.8k Jan 6, 2023
Simple customizable calendar component in Swift :calendar:

Koyomi Koyomi is a simple calendar view framework for iOS, written in Swift ?? Content Features Demo App Usage introduction : Change displayed month,

Shohei Yokoyama 741 Dec 24, 2022
Malendar is a personal calendar app that connects to your default calendar and lets you add/delete events

Malendar is a personal calendar app that connects to your default calendar and lets you add/delete events. It will gather events from your default iOS calendar.

Chase 194 Jan 4, 2023
A fully customizable calendar view acting as a date range picker

Demo Installation CocoaPods With CocoaPods you can simply add GLCalendarView in your Podfile: pod "GLCalendarView", "~> 1.0.0" Source File You can co

Glow Inc 860 Nov 18, 2022