#import "ViewController.h"
#import "LYCalender.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
LYCalender *calender = [[LYCalender alloc] initWithFrame:CGRectMake(0, 100, 320, 250)];
[calender customCellView:^(NSString *dayNumber,UIView *superView) {
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, superView.frame.size.width, superView.frame.size.height / 2)];
label1.textAlignment = NSTextAlignmentCenter;
label1.font = [UIFont systemFontOfSize:14];
label1.text = dayNumber;
[superView addSubview:label1];
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0, superView.frame.size.height / 2, superView.frame.size.width, superView.frame.size.height / 2)];
label2.textAlignment = NSTextAlignmentCenter;
label2.font = [UIFont systemFontOfSize:10];
label2.text = @"¥998";
[superView addSubview:label2];
}];
[calender customCellSelect:^(UIView *view) {
NSLog(@"123");
}];
[self.view addSubview:calender];
}
#import <UIKit/UIKit.h>
typedef void(^CellView)(NSString *dayNumber,UIView *superView);
typedef void(^CellSelect)(UIView *view);
@interface LYCalender : UIView
// 设置每个item显示的内容
- (void)customCellView:(CellView)cellView;
// 设置每个item点击时触发的时间
- (void)customCellSelect:(CellSelect)cellSelect;
@end
#import "LYCalender.h"
#import "LYCalenderCell.h"
#import "MouthModel.h"
#define KWidth self.frame.size.width
#define KHeight self.frame.size.height
#define KYearDisplayNum 10
@interface LYCalender ()<UICollectionViewDelegateFlowLayout,UICollectionViewDataSource>
// 设置collectionView
@property (nonatomic,strong)UICollectionView *collectionView;
// 显示2016年10月格式信息
@property (nonatomic,strong)UILabel *timeLabel;
// 用来存放model数据源
@property (nonatomic,strong)NSMutableArray *dataAry;
// item的视图block
@property (nonatomic,copy)CellView cellView;
// item的点击事件
@property (nonatomic,copy)CellSelect cellSelect;
@end
static NSString *indentifier = @"LYCalenderCell";
@implementation LYCalender
// 懒加载
- (NSMutableArray *)dataAry{
if (!_dataAry) {
self.dataAry = [NSMutableArray array];
}
return _dataAry;
}
// 重写初始化方法
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor whiteColor];
// 设置表头
[self setWeekDateStr];
// 计算日期
[self customDate];
// 自定义子视图
[self set_up];
}
return self;
}
// 设置表头
- (void)setWeekDateStr{
NSArray *weekDayAry = @[@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六"];
for (int i = 0; i < 7; i++) {
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(i * (KWidth / 7), KHeight / 8, KWidth / 7, KHeight / 8)];
label.text = weekDayAry[i];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor lightGrayColor];
label.font = [UIFont systemFontOfSize:12];
[self addSubview:label];
}
self.timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(KWidth / 2 - 60, 0, 120, KHeight / 8)];
_timeLabel.textAlignment = NSTextAlignmentCenter;
_timeLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:_timeLabel];
}
// 根据滚动修改显示年月
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSInteger num = (NSInteger)floor(self.collectionView.contentOffset.y / self.collectionView.frame.size.height);
MouthModel *mouthModel = self.dataAry[num];
_timeLabel.text = mouthModel.timeStr;
}
// 对数据初始化
- (void)customCellView:(CellView)cellView{
self.cellView = cellView;
}
- (void)customCellSelect:(CellSelect)cellSelect{
self.cellSelect = cellSelect;
}
// 自定义子视图
- (void)set_up{
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
flowLayout.minimumLineSpacing = 0;
flowLayout.minimumInteritemSpacing = 0;
flowLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, KHeight / 8 * 2, KWidth, KHeight / 8 * 6) collectionViewLayout:flowLayout];
_collectionView.pagingEnabled = YES;
_collectionView.showsVerticalScrollIndicator = NO;
_collectionView.dataSource = self;
_collectionView.delegate = self;
_collectionView.backgroundColor = [UIColor whiteColor];
[self addSubview:_collectionView];
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:12 * KYearDisplayNum - 1];
[_collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:(UICollectionViewScrollPositionTop) animated:NO];
[self.collectionView registerClass:[LYCalenderCell class] forCellWithReuseIdentifier:indentifier];
}
#pragma mark - collectionView的代理方法 -
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return self.dataAry.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 42;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
LYCalenderCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:indentifier forIndexPath:indexPath];
for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview];
}
MouthModel *mouthModel = self.dataAry[indexPath.section];
if (indexPath.row < mouthModel.dayDataAry.count && indexPath.row >= mouthModel.firstDayForWeekDay - 1) {
UIView *view = [[UIView alloc] initWithFrame:cell.contentView.frame];
CGRect frame = cell.contentView.frame;
frame.size.width = frame.size.width / 6 * 4;
frame.origin.x = frame.size.width / 6;
frame.size.height = frame.size.height / 8 * 7;
frame.origin.y = frame.size.height / 9;
view.frame = frame;
[cell.contentView addSubview:view];
self.cellView(mouthModel.dayDataAry[indexPath.row],view);
}
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
MouthModel *mouthModel = self.dataAry[indexPath.section];
if (indexPath.row < mouthModel.dayDataAry.count && indexPath.row >= mouthModel.firstDayForWeekDay - 1) {
LYCalenderCell *cell = (LYCalenderCell *)[collectionView cellForItemAtIndexPath:indexPath];
self.cellSelect(cell.contentView.subviews[0]);
}
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return CGSizeMake(KWidth / 7, (KHeight - 0) / 8 );
}
// 进行日历计算
- (void)customDate{
NSCalendar *calender = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
for (int i = 12 * KYearDisplayNum; i > 1; i--) {
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:- (i - 1) * 24 * 32 * 60 * 60];
MouthModel *mouthModel = [[MouthModel alloc] init];
// 设置一个月有多少天
mouthModel.dayNumber = [calender rangeOfUnit:NSCalendarUnitDay inUnit:(NSCalendarUnitMonth) forDate:date].length;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY年MM月"];
// 设置时间字符串
mouthModel.timeStr = [formatter stringFromDate:date];
NSDateFormatter *dateFor = [[NSDateFormatter alloc] init];
[dateFor setDateStyle:(NSDateFormatterMediumStyle)];
[dateFor setTimeStyle:(NSDateFormatterNoStyle)];
[dateFor setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFor setDateFormat:@"YYYY-MM-dd"];
[formatter setDateFormat:@"YYYY-MM"];
NSDate *firstDate = [dateFor dateFromString:[NSString stringWithFormat:@"%@-01",[formatter stringFromDate:date]]];
mouthModel.firstDayForWeekDay = [calender component:(NSCalendarUnitWeekday) fromDate:firstDate];
for (int i = 1; i < mouthModel.firstDayForWeekDay; i++) {
[mouthModel.dayDataAry insertObject:@"" atIndex:0];
}
[self.dataAry addObject:mouthModel];
}
for (int i = 1; i <= 12 * KYearDisplayNum; i++) {
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:(i - 1) * 24 * 32 * 60 * 60];
MouthModel *mouthModel = [[MouthModel alloc] init];
mouthModel.dayNumber = [calender rangeOfUnit:NSCalendarUnitDay inUnit:(NSCalendarUnitMonth) forDate:date].length;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY年MM月"];
mouthModel.timeStr = [formatter stringFromDate:date];
NSDateFormatter *dateFor = [[NSDateFormatter alloc] init];
[dateFor setDateStyle:(NSDateFormatterMediumStyle)];
[dateFor setTimeStyle:(NSDateFormatterNoStyle)];
[dateFor setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[dateFor setDateFormat:@"YYYY-MM-dd"];
[formatter setDateFormat:@"YYYY-MM"];
NSDate *firstDate = [dateFor dateFromString:[NSString stringWithFormat:@"%@-01",[formatter stringFromDate:date]]];
mouthModel.firstDayForWeekDay = [calender component:(NSCalendarUnitWeekday) fromDate:firstDate];
for (int i = 1; i < mouthModel.firstDayForWeekDay; i++) {
[mouthModel.dayDataAry insertObject:@"" atIndex:0];
}
[self.dataAry addObject:mouthModel];
}
}
@end
#import <UIKit/UIKit.h>
@interface LYCalenderCell : UICollectionViewCell
@end
#import "LYCalenderCell.h"
@implementation LYCalenderCell
@end
#import <Foundation/Foundation.h>
@interface MouthModel : NSObject
@property (nonatomic,copy)NSString *timeStr;
@property (nonatomic,assign)NSInteger dayNumber;
@property (nonatomic,assign)NSInteger firstDayForWeekDay;
@property (nonatomic,strong)NSMutableArray *dayDataAry;
@end
#import "MouthModel.h"
@implementation MouthModel
- (NSMutableArray *)dayDataAry{
if (!_dayDataAry) {
self.dayDataAry = [NSMutableArray array];
}
return _dayDataAry;
}
- (void)setDayNumber:(NSInteger)dayNumber{
_dayNumber = dayNumber;
for (int i = 1; i <= dayNumber; i++) {
[self.dayDataAry addObject:[NSString stringWithFormat:@"%d",i]];
}
}
@end
iOS 日历效果
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在日历的使用中我们经常会遇到这样的场景, 想要让家人了解旅行的日程安排 想要让团队成员知道例会的时间地点 让学员了...
- 不知不觉,我们订阅了太多的日历,有一些自己不再想关注,可是在日历里面又没有直接删除订阅的日历,怎么办?这里我再给大...
- POSIX POSIX是一种标准,例如有多线程编程标准、网络编程标准等。 POSIX多线程 Linux下,一般多线...