在我们开发的过程中,难免会遇到一些自定义系统控件的问题,不要发愁,把它当做一个游戏来做就可以了!!
不说废话,开始上代码了!!!!!
首先,这里使用的是view来进行自定义日历的,主要使用的UICollectionView控件
1、声明文件,在.h中定义代码块,往vc中传值使用
#import
typedefvoid(^selectDate)(NSString*selectedDate);
@interfaceDBSelectedCalenderView :UIView
@property(nonatomic,copy) selectDate date;
@end
2、接下来就是主要的.m中的实现了(做好准备了吗?)
#import "DBSelectedCalenderView.h"
#import "DBCalenderCollectionViewCell.h" //单元格
@interface DBSelectedCalenderView()
@property(nonatomic,strong) UILabel *today;
@property(nonatomic,strong)UICollectionView*calenderCollectionView;
@property(nonatomic,strong) UICollectionViewFlowLayout *layout;
@end
#define cellWidth30 //单元格宽高
#define margin ([UIScreen mainScreen].bounds.size.width - cellWidth *7) /8 //间距
@implementationDBSelectedCalenderView
-(instancetype)initWithFrame:(CGRect)frame{
if(self= [superinitWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];
[selfaddSubview:self.today];
[self addSubview:self.calenderCollectionView];
UIView *vi = [[UIView alloc]init];
vi.backgroundColor = [UIColor groupTableViewBackgroundColor];
[selfaddSubview:vi];
vi.sd_layout.topSpaceToView(self.calenderCollectionView, margin).leftSpaceToView(self, 0).rightSpaceToView(self, 0).bottomSpaceToView(self, 0);
// 注册collectionViewcell:WWCollectionViewCell是我自定义的cell的类型
[self.calenderCollectionView registerClass:[DBCalenderCollectionViewCell class] forCellWithReuseIdentifier:@"DBCalenderCollectionViewCell"];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formattersetDateFormat:@"dd"];
NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];
[_calenderCollectionView selectItemAtIndexPath:[NSIndexPath indexPathForItem:nowDay - 1 inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionNone];
[self.calenderCollectionView reloadData];
}
return self;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)collectionView{
return 1;
}
-(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section{
return [self getNumberOfDaysInMonth];
}
-(UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath{
DBCalenderCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"DBCalenderCollectionViewCell" forIndexPath:indexPath];
cell.layer.masksToBounds = YES;
cell.layer.cornerRadius = 4;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formattersetDateFormat:@"dd"];
NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];
NSIndexPath *inde = [NSIndexPath indexPathForItem:nowDay - 1 inSection:0];
DBCalenderCollectionViewCell *defaultCell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:inde];
// defaultCell.backgroundColor = [UIColor yellowColor];
defaultCell.layer.borderColor = HTitColor.CGColor;
defaultCell.layer.borderWidth=1;
cell.nowDay.text= [NSStringstringWithFormat:@"%ld",indexPath.row+1];
returncell;
}
-(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formattersetDateFormat:@"dd"];
NSInteger nowDay = [[formatter stringFromDate:[NSDate date]] integerValue];
NSIndexPath *inde = [NSIndexPath indexPathForItem:nowDay - 1 inSection:0];
DBCalenderCollectionViewCell *defaultCell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:inde];
defaultCell.layer.borderColor = [UIColor clearColor].CGColor;
defaultCell.layer.borderWidth=1;
DBCalenderCollectionViewCell *cell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
cell.layer.borderColor = HTitColor.CGColor;
cell.layer.borderWidth = 1;
NSDateFormatter *formatterr = [[NSDateFormatter alloc] init];
[formatterrsetDateFormat:@"yyyy-MM"];
NSString*nowMonth = [formatterrstringFromDate:[NSDatedate]];
NSString *str = [nowMonth stringByAppendingString:[NSString stringWithFormat:@"-%@",cell.nowDay.text]];
NSLog(@"%@",str);
if(self.date) {
self.date(str);
}
}
-(void)collectionView:(UICollectionView*)collectionView didDeselectItemAtIndexPath:(NSIndexPath*)indexPath{
DBCalenderCollectionViewCell *cell = (DBCalenderCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
cell.layer.borderColor = [UIColor clearColor].CGColor;
cell.layer.borderWidth = 1;
}
/** 每个cell的尺寸*/
- (CGSize)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath*)indexPath{
return CGSizeMake(cellWidth, cellWidth);
}
#pragma mark - setter and getter
-(UILabel*)today{
if(!_today) {
_today = [[UILabel alloc]initWithFrame:CGRectMake(20, 20, self.frame.size.width - 20, 50)];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formattersetDateFormat:@"yyyy-MM-dd"];
NSDateFormatter *outputFormatter=[[NSDateFormatter alloc]init];
[outputFormattersetDateFormat:@"EEEE-MMMM-d"];
NSString*outputDateStr=[outputFormatterstringFromDate:[NSDatedate]];
NSArray*weekArray=[outputDateStrcomponentsSeparatedByString:@"-"];
_today.numberOfLines = 2;
_today.text = [NSString stringWithFormat:@"%@\n%@",[formatter stringFromDate:[NSDate date]],[self cTransformFromE:[weekArray objectAtIndex:0]]];
}
return _today;
}
-(UICollectionView*)calenderCollectionView{
if (!_calenderCollectionView) {
_calenderCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 70, self.frame.size.width, 150 + 5 * margin) collectionViewLayout:self.layout];
_calenderCollectionView.delegate = self;
_calenderCollectionView.dataSource = self;
_calenderCollectionView.scrollEnabled = NO;
_calenderCollectionView.backgroundColor = [UIColor whiteColor];
}
return _calenderCollectionView;
}
-(UICollectionViewFlowLayout *)layout{
if(!_layout) {
_layout = [[UICollectionViewFlowLayout alloc]init];
_layout.itemSize = CGSizeMake(cellWidth, cellWidth);
//四周边距
_layout.sectionInset = UIEdgeInsetsMake(margin, margin, margin, margin);
_layout.minimumInteritemSpacing = margin;
_layout.minimumLineSpacing = margin;
//设置滑动方向
_layout.scrollDirection = UICollectionViewScrollDirectionVertical;
}
return _layout;
}
// 获取当月的天数
- (NSInteger)getNumberOfDaysInMonth
{
NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; // 指定日历的算法 NSGregorianCalendar - ios 8
NSDate* currentDate = [NSDatedate];
NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay //NSDayCalendarUnit - ios 8
inUnit:NSCalendarUnitMonth//NSMonthCalendarUnit - ios 8
forDate:currentDate];
returnrange.length;
}
//转换英文为中文
-(NSString*)cTransformFromE:(NSString*)theWeek{
NSString*chinaStr;
if(theWeek){
if([theWeekisEqualToString:@"Monday"]){
chinaStr =@"星期一";
}elseif([theWeekisEqualToString:@"Tuesday"]){
chinaStr =@"星期二";
}elseif([theWeekisEqualToString:@"Wednesday"]){
chinaStr =@"星期三";
}elseif([theWeekisEqualToString:@"Thursday"]){
chinaStr =@"星期四";
}elseif([theWeekisEqualToString:@"Friday"]){
chinaStr =@"星期五";
}elseif([theWeekisEqualToString:@"Saturday"]){
chinaStr =@"星期六";
}elseif([theWeekisEqualToString:@"Sunday"]){
chinaStr =@"星期日";
}
}
returnchinaStr;
}
当然,还有主要的就是自定义单元格哦!! 小伙伴们一定不要忘记这致命的一点哦!!
.h
#import
@interfaceDBCalenderCollectionViewCell :UICollectionViewCell
@property(nonatomic,strong) UILabel *nowDay;
@end
.m
#import "DBCalenderCollectionViewCell.h"
@interface DBCalenderCollectionViewCell()
@end
@implementationDBCalenderCollectionViewCell
-(instancetype)initWithFrame:(CGRect)frame{
if(self= [superinitWithFrame:frame]) {
[self.contentView addSubview:self.nowDay];
}
return self;
}
-(UILabel*)nowDay{
if(!_nowDay) {
_nowDay = [[UILabel alloc]initWithFrame:self.contentView.frame];
_nowDay.textColor=HBgColor;
_nowDay.textAlignment = NSTextAlignmentCenter;
}
return _nowDay;
}
@end
OK,这样一个自定义日历控件就出来了,其实好多东西本身并不难,是我们自己想复杂了,把它当做游戏,那样会很有乐趣而且很有效果哦!!!!!!
网友评论