Skip to content

یه انتخاب‌گر تاریخ پارسی (که بمراتب از کامپوننت پیش‌فرض خود آی‌او‌اس بهتر و قشنگ‌تره!)

License

Notifications You must be signed in to change notification settings

omidgolparvar/IDPersianDatePicker

Repository files navigation

🗓 🇮🇷 انتخاب‌گر تاریخ پارسی

خود آی‌او‌اس یه DatePicker داره که میشه Locale و Calendar رو براش به بطوری تنظیم کرد تا باهاش بتونیم یه تاریخ پارسی انتخاب کنیم. اما شخصا بنظرم زیاد جالب نبود؛ چون با استفاده از اون:

  • هربار فقط میشه یک تاریخ رو انتخاب کرد.
  • از فونت پیشفرض خود سیستم عامل استفاده می‌کنه.
  • خوشگل نیست.

برای همین تصمیم گرفتم یه چیزی پیاده‌سازی کنم تا این ویژگی‌ها/ایرادات رو نداشته باشه. چندتا عکس هم ازش قرار دادم، تا بتونین یه نگاهی (قبل از استفاده) بهش بندازین.

نصب

برای نصب می‌تونین از Cocoapod استفاده کنین. عبارت مورد استفاده برای نصب هم اینه:

pod 'IDPersianDatePicker'

👈 توجه داشته باشین که زبان مورد استفاده توی این پروژه سوییفت نسخه ۴.۲ بوده.

استفاده

قدم اول

اولین قدم اینه که ایمپورتش کنین:

import IDPersianDatePicker

قدم دوم

مرحله بعد اینه که ویوکنترلر شما یه پروتکل رو پیاده‌سازی کنه. پروتکلی که باید پیاده‌سازی کنه PersianDatePickerDelegate هست. وظیفه این پروتکل آماده کردن داده‌ها و مشخصه‌های مورد استفاده در انتخاب‌گر هست.
متدها و مشخصه‌هایی که داره بصورت زیر هست:

  • متد persianDatePicker(canSelectDate date: Date) و خروجی از نوع Bool

    با استفاده از این متد می‌تونین از انتخاب یه سری روزها جلوگیری کنین.


  • متد persianDatePicker(didSelectDates dates: [Date])

    زمانیکه که کاربر روی دکمه انتخاب بزنه، روزهایی که انتخاب شده، با استفاده از این متد در دسترس خواهند بود.


قدم سوم

برای فراخوانی و نمایش انتخاب‌گر هم بصورت زیر عمل می‌کنیم:

PersianDatePicker.Present(
  sourceController : UIViewController,
  configuration    : PersianDatePicker.Configuration,
  delegate         : PersianDatePickerDelegate,
  completion       : (() -> Void)?
)

تنظیمات (یا همون PersianDatePicker.Configuration)

توی این نسخه، تنظیمات مورد نیاز انتخاب‌گر رو از delegate جدا کردم. الان موقع نمایش باید تنظیمات مورد نیاز رو بسازین و ارجاع بدین. این تنظیمات به چند بخش اصلی تقسیم می‌شن:

تنظیمات رابط کاربری (مشخصه ui)

var font: UIFont = .systemFont(ofSize: 16, weight: .regular)
  • فونت مورد استفاده رو مشخص می‌کنه.

var selectedDayTextColor: UIColor	= .black
  • رنگ مورد استفاده برای متن المان‌های انتخاب‌شده رو مشخص می‌کنه.

var selectedDayBackgroundColor: UIColor = /* a_beautiful_color */
  • رنگ مورد استفاده برای پس‌زمینه المان‌های انتخاب‌شده رو مشخص می‌کنه.

تنظیمات متن‌ها (مشخصه texts)

var title: String = "تاریخ مورد نظر خود را انتخاب نمایید"
  • عنوان مورد نظر برای نمایش.

var message: String? = nil
  • توضیح مورد نظر برای نمایش.

تنظیمات انتخاب تاریخ(ها) (مشخصه selection)

var minimumDate: Date
var maximumDate: Date
  • اینها تاریخ کمینه و بیشینه رو توی تقویم مشخص می‌کنن.

var canSelectMultipleDates: Bool = false
  • این مشخصه بیانگر اینه که آیا میشه چندین تاریخ رو انتخاب کرد، یا فقط مجاز به انتخاب یک تاریخ هست.
  • مقدار پیش‌فرض این مشخصه برابر false هست.

var preselectedDates: [Date] = []
  • این مشخصه، تاریخ‌هایی رو مشخص می‌کنه که بصورت پیش‌فرض انتخاب‌شده هستن.
  • اگه این مشخصه خالی نباشه، بصورت پیش‌فرض صفحه‌ای به کاربر نمایش داده میشه، که کوچک‌ترین تاریخ انتخاب‌شده داخل‌اش باشه.

var defaultDay: Date? = nil
  • این مشخصه، تاریخ پیش‌فرض تقویم برای نمایش هست. یعنی اگر این مشخصه مقدار داشته باشه، صفحه‌ای از تقویم بطور پیش‌فرض نمایش داده میشه که این تاریخ داخل‌اش باشه.
  • مقدار پیش‌فرض این مشخصه برابر nil هست.
  • زمانیکه تاریخ از پیش تعیین‌شده‌ای نداشته باشیم، و این مشخصه هم مقدار نداشته باشه، بصورت پیش‌فرض صفحه اول مجاز تقویم به کاربر نمایش داده میشه؛ یعنی صفحه‌ای که minimumDate داخل‌اش هست.
  • برای تنظیم صفحه پیش‌فرض تقویم، بررسی این مشخصه اولویت بالاتری نسبت به preselectedDates دارد.

سخن آخر

  • 👀 اگه ایرادی توی روند پیاده‌سازی یا استفاده مشاهده کردین، حتما بگین تا رفعش کنیم.
  • 🤝 اگه قابلیت خاصی به ذهن‌تون رسید که می‌تونست به بهتر شدن این پروژه کمک کنه، حتمن بگین؛ شاید با کمک هدیگه پیاده‌سازی‌اش کردیم.
  • 😋 تنکیوووووو.

About

یه انتخاب‌گر تاریخ پارسی (که بمراتب از کامپوننت پیش‌فرض خود آی‌او‌اس بهتر و قشنگ‌تره!)

Resources

License

Stars

Watchers

Forks

Packages

No packages published