PMCalendar 0.3.2

PMCalendar 0.3.2

测试已测试
语言语言 Obj-CObjective C
版权 MIT
发布最后一次发布2014年12月

Pavel Mazurin 维护。



  • Pavel Mazurin

PMCalendar v0.3

又一个iOS的日历组件。兼容iOS 4.0(iPhone和iPad)及以上版本。

UI受到ocrickardOCCalendarController的启发。这是一个相当不错的组件,但它缺少一些我希望看到的有用特性。不幸的是,OCCalendarController难以维护,所以我决定创建自己的实现。

PMCalendar支持在一个月或几个月内选择多个日期,呈现为一个弹出菜单(如果您之前使用过UIPopoverController,您会发现PMCalendar的管理方法非常相似),支持即时的方向更改,并且不需要任何第三方框架。

PMCalendar使用iOS的CoreGraphics和CoreText框架。

它肯定不是没有bug的,所以如果您打算将PMCalendar用于生产环境,请务必对其进行彻底测试;)

如果有什么问题或建议,请随时联系我。如果您知道如何改进PMCalendar,请不要犹豫,联系我或发送pull request。

法律

PMCalendar采用MIT许可证发布。

屏幕截图

Screenshot 1  Screenshot 2

Screenshot 3

使用方法

  • 将PMCalendar目录添加到您的Xcode项目
  • 将CoreGraphics和CoreText框架添加到您的项目
  • #import "PMCalendar.h"
  • 用特定的主题名(见下文)和大小创建PMCalendarController的实例
        PMCalendarController *calendarController = [[PMCalendarController alloc] initWithThemeName:@"my super theme name" andSize:CGSizeMake(300, 200)];
  • 或使用默认设置
        // default theme name (default.plist) and size (see default.plist for details)
        PMCalendarController *calendarController = [[PMCalendarController alloc] init];
        // default theme name (default.plist) and specific size
        PMCalendarController *calendarController = [[PMCalendarController alloc] initWithSize:CGSizeMake(300, 200)];
        // specific theme name and default calendar size for this theme
        PMCalendarController *calendarController = [[PMCalendarController alloc] initWithThemeName:@"my super theme name"];
  • 实现PMCalendarControllerDelegate方法,以了解控制器的状态变化
        - (BOOL)calendarControllerShouldDismissCalendar:(PMCalendarController *)calendarController;
        - (void)calendarControllerDidDismissCalendar:(PMCalendarController *)calendarController;
        - (void)calendarController:(PMCalendarController *)calendarController didChangePeriod:(PMPeriod *)newPeriod;
  • 不要忘记分配委托!
        calendarController.delegate = self;
  • 从视图(例如 UIButton)中展示calendarController,以便在旋转时calendar可定位自身
         [calendarController presentCalendarFromView:pressedButton
                            permittedArrowDirections:PMCalendarArrowDirectionUp | PMCalendarArrowDirectionLeft
                                           isPopover:YES
                                            animated:YES];
  • 或CGRect
         [calendarController presentCalendarFromRect:CGRectMake(100, 100, 10, 10)
                                              inView:self.view
                            permittedArrowDirections:PMCalendarArrowDirectionUp | PMCalendarArrowDirectionLeft
                                           isPopover:YES
                                            animated:YES];
  • 关闭它
         [calendarController dismissAnimated:YES];

PMPeriod

    @interface PMPeriod : NSObject

    @property (nonatomic, strong) NSDate *startDate;
    @property (nonatomic, strong) NSDate *endDate;

    /**
     * Creates new period with same startDate and endDate
     */
    + (id) oneDayPeriodWithDate:(NSDate *) date;

    + (id) periodWithStartDate:(NSDate *) startDate endDate:(NSDate *) endDate;

    - (NSInteger) lengthInDays;

    /**
     * Creates new period from self with proper order of startDate and endDate.
     */
    - (PMPeriod *) normalizedPeriod;

    @end

已实现属性

    @property (nonatomic, assign) id<PMCalendarControllerDelegate> delegate;

所选日期范围

    @property (nonatomic, strong) PMPeriod *period;

允许选择的日期范围

    @property (nonatomic, strong) PMPeriod *allowedPeriod;

星期一是周的第一天。如果设置为NO,则星期日是第一天

    @property (nonatomic, assign, getter = isMondayFirstDayOfWeek) BOOL mondayFirstDayOfWeek;

如果设置为NO,则只能选择一个日期。否则,用户可以滑动以选择日期范围

    @property (nonatomic, assign) BOOL allowsPeriodSelection;

如果设置为YES,用户可以长按箭头快速遍历月份

    @property (nonatomic, assign) BOOL allowsLongPressMonthChange;

箭头方向(类似UIPopoverController的arrowDirection)

    @property (nonatomic, readonly) PMCalendarArrowDirection arrowDirection;

日历控制器的大小

    @property (nonatomic, assign) CGSize size;

返回弹窗是否可见(已展示)

    @property (nonatomic, assign, readonly, getter = isCalendarVisible) BOOL calendarVisible;

主题(beta!)

主题允许你在不触碰PMCalendar代码的情况下创建自己的日历组件外观。理论上……在实践中,目前的实现是在组件绘制速度的灵活性和速度之间做出妥协。因此,某些你期望正常工作的主题属性可能不会工作 :)

然而,目前的实现已经足够强大,例如创建类似这样的东西

Apple calendar theme 1 Apple calendar theme 2

主题文档正在制作中,因此现在请使用两个示例("default.plist" 和 "apple calendar.plist")作为参考。

如果您想分享为PMCalendar创建的主题,请联系我,我会将其以及您项目的链接一起添加 :)