آیدی آلرت ویوکنترلر
پیشنمایش!
مشکل
زمانیکه توی اپهای آیاواس بخواین از UIAlertViewController
استفاده کنین، این ویوکنترلر از فونتهای پیشفرض سیستمعامل استفاده میکنه. با استفاده از یه سری کد، میشه فونت و رنگ عنوان و پیام بالای کنترلر رو تغییر داد.
اما برای گزینهها یا همون UIAlertAction
ها، رویه مشخصی برای تغییر رنگ یا فونت نوشتهها وجود نداره (یا حداقل من پیدا نکردم!). البته اگه tintColor
خود alertController
رو تغییر بدین، رنگ همه گزینهها تغییر میکنه. اما مشکل اصلی همون فونت هستش.
راه حل
برای حل این مشکل، یه سری کلاس جدید پیادهسازی کردیم و همینطور یه سری کارای مهندسیطور کردیم!!
مدلها و نحوه استفادهشون
IDAlertAction
مدل این مدل در واقع مدل مورد نظر ما برای اکشنها (یا همون گزینههای آلرتکنترلر) هست.
نحوه ساخت
دو مدل اکشن داریم. یکی مدلی که عنوان و عکس (یا دوتا عکس) داره، و البته بهمراه فونت و رنگ و چینش متن. مدل دیگه، مدلی هست که عنوان و توضیح داره فقط. البته میتونیم فونت و رنگ براش در نظر بگیریم، ولی عکس نخواهد داشت. این مدل دوم، برای مواقعی هست که شما بخواین در کنار عنوان گزینهها، یه توضیح کوچک هم ارائه بدین؛ تا کاربر مطمئنتر بتونه گزینه مورد نظرش رو انتخاب کنه.
برای ساخت مدل اول از کد زیر استفاده میکنیم:
static func InitializeNormalAction( title : String, alignment : NSTextAlignment = .center, color : UIColor? = nil, font : UIFont? = nil, leftImage : UIImage? = nil, rightImage : UIImage? = nil, actionStyle : UIAlertAction.Style = .default, handler : Handler?)
پارامترها بنظرم مشخص هستن و نیازی به توضیح ندارن.
برای ساخت مدل دوم (عنوان و توضیح) از کد زیر استفاده میکنیم:
static func InitializeTitleAndSubtitleAction( title : String, titleColor : UIColor? = nil, titleFont : UIFont? = nil, subtitle : String, subtitleColor : UIColor? = nil, subtitleFont : UIFont? = nil, actionStyle : UIAlertAction.Style = .default, actionHeight : CGFloat? = nil, handler : Handler?)
اینجا هم پارامترها بنظرم مشخص هستن و نیازی به توضیح ندارن.
نکتهها
IDAlertAction
خودش دیگه متدی برای شخصیسازی نداره.
static
تعییر شدن، شما باید به شکل زیر فراخوانیشون کنین:
let action1 = IDAlertAction.InitializeNormalAction(...) let action0 = IDAlertAction.InitializeTitleAndSubtitleAction(...)
مشخصههای کمکی
برای راحتی بیشتر، چندتا متغیر از نوع static
در نظر گرفته شده، تا بصورت پیشفرض، اگه فونتی برای قسمتهای مختلف اکشن اختصاص داده نشده بود، از این مقادیر استفاده بشه. شما با یکبار مقداردهی این مشخصهها، تمام آلرتاکشنها رو با اون فونتها مشاهده میکنین.
public static var TitleTextFont: UIFont = ... public static var SubtitleTextFont: UIFont = ...
یعنوان مثال میتونین مقداردهی این مشخصهها رو توی AppDelegate
انجام بدین.
IDAlertHeader
مدل این مدل عنوان و پیام آلرت رو پیکربندی میکنه.
استفادهاش برای مشخصکردن title
و message
و همینطور مشخصکردن فونت و رنگ هرکدوم هست.
نحوه ساخت
سازنده بصورت زیر هست:
init(title: String?, message: String?)
اصن نیازی به توضیح هست؟!
متدها
برای شخصیسازی هدر دوتا متد در نظر گرفته شده. هر دو رنگ و فونت رو تغییر میدن؛ یکی برای عنوان و یکی هم برای پیام.
setup{Title|Message}(font: UIFont?, color: UIColor?)
مشخصههای کمکی
اینجا هم یه سری مشخصه بصورت static
در نظر گرفته شدن، تا هربار نیازی نباشه شما فونت و رنگ عنوان و پیام رو مقداردهی کنین.
static var TitleFont: UIFont = .systemFont(ofSize: 16, weight: .bold) static var TitleColor : UIColor = .black static var MessageFont : UIFont = .systemFont(ofSize: 14, weight: .regular) static var MessageColor : UIColor = .darkGray
یعنوان مثال میتونین مقداردهی این مشخصهها رو هم توی AppDelegate
انجام بدین.
IDAlertHeaderView
مدل با استفاده از این مدل، میتونیم بجای نمایش عنوان و پیام، از یه ویو اختصاصی برای هدر آلرتکنترلر استفاده کنیم.
نحوه ساخت
متدی که برای ساخت استفاده میشه، بصورت زیر تعریف میشه:
init(contentView: UIView, height: CGFloat)
این سازنده، دوتا پارامتر ورودی داره. یکی خود اون ویویی که قرار هست نمایش داده بشه، و یکی هم ارتفاع مورد نیاز ما. نکتهای که هست، اینه که این ارتفاع رو جوری در نظر بگیرین که چیزی توی ویو شما از قلم نیوفته!!
IDAlertController
مدل این مدل همون مدلی هست با استفاده ازش، خود UIAlertController
نمایش داده میشه.
نحوه ساخت
براساس نوع استفاده ما، دوتا سازنده داریم:
init(header: IDAlertHeader?, actions: [IDAlertAction], preferredStyle style: UIAlertController.Style)
همونطور که مشخصه، این سازنده، یه IDAlertHeader
میتونه بگیره. اینکه میگم میتونه، به این خاطر هست که این ورودی Optional
هست و اگه شما آلرتی بخواین نمایش بدین که عنوان و پیام نداره، این ورودی رو nil
قرار میدین.
ورودی دوم میشه اکشنهای مورد نظر شما؛ که رویه ساختشون رو قبلتر توضیح دادم.
ورودی سوم هم مشخصکننده نوع نمایش آلرتکنترلر هست؛ اینکه بصورت ActionSheet
باشه یا بصورت Alert
.
و نوع دوم سازنده هم بصورت زیر هست:
init(headerView: IDAlertHeaderView, actions: [IDAlertAction], preferredStyle: UIAlertController.Style)
این سازنده، یه IDAlertHeaderView
میگیره. ورودی دوم میشه اکشنهای مورد نظر شما؛ که رویه ساختشون رو قبلتر توضیح دادم. ورودی سوم هم مشخصکننده نوع نمایش آلرتکنترلر هست؛ اینکه بصورت ActionSheet
باشه یا بصورت Alert
.
متدها
دوتا متد در دسترس شماست:
متد برای مقداردهی tintColor
آلرتکنترلر:
setTintColor(_ color: UIColor)
متد زیر هم برای نمایش آلرتکنترلر در iPad کاربرد داره:
setupPopoverPresentationController( sourceView: UIView, permittedArrowDirections: UIPopoverArrowDirection )
این متد دوتا ورودی داره. اولی بعنوان ویو (یا المانی) بکار میره که باعث نمایش آلرتکنترلر شده. و متد دوم هم برای جهتهای مجاز نمایش فلش برای آلرتکنترلر در آیپد بکار میره.
در آخر
اگه توی استفاده به مشکلی برخورد کردین، بگین تا در صورت امکان رفعاش کنیم.
اگه هم از این خوشتون اومد، به بقیه هم معرفیاش کنین، تا بقیه هم ازش استفاده کنن؛ و اینجوری مجبور نباشیم برای یه آلرت، یا از فونت پیشفرض استفاده کنیم، یا یه کتابخانه دیگه اضافه کنیم.