iOS 심 플 달력 컨트롤 EBCalendarView 구현 코드
EBCalendarView 달력 컨트롤,호출 이 간단 하고 코드 가 간결 합 니 다.
github 주소:https://github.com/woheduole/EBCalendarView
효과 도
호출 예시
EBCalendarView *calendarView = [[EBCalendarView alloc] initWithFrame:CGRectMake(0, 64, CGRectGetWidth(self.view.bounds), 0)];
calendarView.delegate = self;
//calendarView.maxLastMonths = 0;
//calendarView.maxNextMonths = 0;
[self.view addSubview:calendarView];
- (void)calendarView:(EBCalendarView*)calendarView didSelectedDate:(NSDate*)date {
NSLog(@" :%@", [date stringWithFormat:@"yyyy-MM-dd"]);
}
코드 디 렉 터 리사고의 방향
EBCalendarView
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:self.flowLayout];
_collectionView.dataSource = self;
_collectionView.delegate = self;
_collectionView.showsVerticalScrollIndicator = NO;
_collectionView.showsHorizontalScrollIndicator = NO;
_collectionView.backgroundColor = [UIColor whiteColor];
[_collectionView registerClass:[EBCalendarDayCell class] forCellWithReuseIdentifier:kEBCalendarViewReuseIdentifier];
_flowLayout.itemSize = CGSizeMake(viewWidth / kEBCalendarViewCellColumn, kEBCalendarViewCellHeight);
UICollectionView 컨트롤 을 통 해 날짜 데 이 터 를 표시 하고 UICollectionView FlowLayout 의 item Size 를 설정 합 니 다.높이 는 고정 할 수 있 고 너 비 는 보기 의 총 너비 로 7 로 제거 합 니 다.
//
NSInteger rows = ceilf(_dates.count / kEBCalendarViewCellColumn);
self.frame = ({
CGRect frame = self.frame;
frame.size.height = kEBCalendarViewWeekViewHeight + kEBCalenderNavigationViewHeight + (rows * kEBCalendarViewCellHeight);
frame;
});
달 을 바 꿀 때 매달 1 일이 있 는 주 는 일치 하지 않 기 때문에 줄 수가 다 를 수 있 습 니 다.예 를 들 어 한 달 은 31 일이 고 1 일 은 일요일 입 니 다.이때 날 짜 는 6 줄 이 있 습 니 다.만약 에 1 일이 월요일 이 라면 5 줄 을 표시 합 니 다.여 기 는 줄 수 에 따라 동태 적 으로 높이 를 바 꿉 니 다.
- (NSDate *)dateByAddingMonths:(NSInteger)months {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setMonth:months];
return [calendar dateByAddingComponents:components toDate:self options:0];
}
월 이 누적 되 거나 누 감 될 때 NSCalendar 류 를 통 해 월 수 를 직접 증가 시 키 면 2018-12 클릭 으로 다음 달 2019-01 또는 2019-01 클릭 으로 지난달 2018-12 로 전환 하 는 작업 을 스스로 처리 하지 않 아 도 된다.EBCalendarModel 데이터 모델
@property (nonatomic, assign) NSInteger year;
@property (nonatomic, assign) NSInteger month;
@property (nonatomic, assign) NSInteger day;
//
@property (nonatomic, assign, getter=isSelected) BOOL selected;
//
@property (nonatomic, assign, getter=isToday) BOOL today;
// year,month,day NSDate
@property (nonatomic, strong, readonly) NSDate *date;
- (NSDate*)date {
if (_year == 0 || _month == 0 || _day == 0) {
return nil;
}
return [NSDate dateWithString:[NSString stringWithFormat:@"%zd-%zd-%zd"
, _year
, _month
, _day] format:@"yyyy-MM-dd"];
}
EBCalender WeekView 주간 보기
- (void)layoutSubviews {
[super layoutSubviews];
[self createWeekView];
}
- (void)setWeeks:(NSArray *)weeks {
_weeks = weeks;
[self createWeekView];
}
- (void)createWeekView {
CGFloat viewWidth = CGRectGetWidth(self.bounds)
, viewHeight = CGRectGetHeight(self.bounds);
if (_weeks.count == 0 || viewHeight == 0) return;
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
NSInteger weekCount = _weeks.count;
CGFloat weekWidth = viewWidth / weekCount;
for (int n = 0; n < weekCount; n ++ ) {
NSString *week = _weeks[n];
UILabel *weekLabel = [[UILabel alloc] initWithFrame:CGRectMake(weekWidth * n, 0, weekWidth, viewHeight)];
weekLabel.font = [UIFont systemFontOfSize:14];
weekLabel.textColor = [UIColor colorWithHexString:@"333333"];
weekLabel.textAlignment = NSTextAlignmentCenter;
weekLabel.text = week;
[self addSubview:weekLabel];
}
}
들 어 오 는 매개 변수 weeks 동적 으로 UILabel 디 스 플레이 주간 데 이 터 를 추가 합 니 다.EBCalenderNavigation 월 내 비게 이 션 보기 보기 보기
- (void)changeMonthAction:(UIButton*)button {
BOOL isNextMonth = NO;
if ([button isEqual:_nextMonthButton]) {
//
isNextMonth = YES;
}
if ([self.delegate respondsToSelector:@selector(calenderNavigationViewDidChangeMonth:isNextMonth:)]) {
[self.delegate calenderNavigationViewDidChangeMonth:self isNextMonth:isNextMonth];
}
}
이 안 에는 좌우 화살표 와 중간 연월 이 표 시 됩 니 다.좌우 화살 표 는 두 개의 UIButton 입 니 다.이 를 클릭 할 때 에이 전 트 를 통 해 EBCalendarView 보기 로 동작 을 전달 합 니 다.UIColor+EB 색상 보조 클래스 추가
+ (UIColor *)colorWithHexString:(NSString *)hexString {
NSScanner *scanner = [NSScanner scannerWithString:hexString];
unsigned hexNum;
if (![scanner scanHexInt:&hexNum]) return nil;
return [UIColor colorWithRGBHex:hexNum];
}
+ (UIColor *)colorWithRGBHex:(UInt32)hex {
int r = (hex >> 16) & 0xFF;
int g = (hex >> 8) & 0xFF;
int b = (hex) & 0xFF;
return [UIColor colorWithRed:r / 255.0f
green:g / 255.0f
blue:b / 255.0f
alpha:1.0f];
}
코드 에 있 는 색상 은 모두 16 진법 의 색상 값 을 사용 하 는데 순 전 히 개인 적 인 습관 입 니 다.NSDate+EBAdd date 보조 클래스
// YYKit
- (NSInteger)year;
// YYKit
- (NSInteger)month;
// YYKit
- (NSInteger)day;
// YYKit
- (NSInteger)weekday;
// YYKit
- (BOOL)isToday;
//
- (NSUInteger)numberOfDaysInMonth;
// YYKit
- (NSString *)stringWithFormat:(NSString *)format;
// YYKit
- (NSDate *)dateByAddingMonths:(NSInteger)months;
// YYKit
+ (NSDate *)dateWithString:(NSString *)dateString format:(NSString *)format;
소결:UICollectionView 는 강력 한 컨트롤 입 니 다.UICollectionView FlowLayout 를 통 해 레이아웃 을 다시 쓰 면 멋 진 기능 을 많이 할 수 있 습 니 다.이 달력 컨트롤 은 아 이 템 의 너비 만 설정 되 어 있 을 뿐 기본 적 인 사용 입 니 다.그 중에서 두 가 지 를 주의해 야 한다.1.매달 1 일 은 주 몇 일 에 속 하고 그 시작 위 치 를 설정 해 야 한다.2.매달 며칠 씩 있 습 니까?app 형식 이 다 르 면 달력 컨트롤 의 실제 표현 방식 이 다 를 수 있 습 니 다.기본 적 인 논 리 는 모두 같 습 니 다.작은 제어 일 뿐 입 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.