iOS 심 플 달력 컨트롤 EBCalendarView 구현 코드

7815 단어 iOS달력 컨트롤
본 고 는 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 형식 이 다 르 면 달력 컨트롤 의 실제 표현 방식 이 다 를 수 있 습 니 다.기본 적 인 논 리 는 모두 같 습 니 다.작은 제어 일 뿐 입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기