我在这里感到困惑。我在ios应用程序中实现了一个日历控件。但是当用户选择日期时无法找到特定日期的位置。如何找到用户选择的特定日期的位置?请有人帮助我或给我一些建议。提供任何示例代码。将不胜感激。
在 DayButton.h 中
//
// DayButton.h
// DDCalendarView
//
//
//
#import <UIKit/UIKit.h>
@protocol DayButtonDelegate <NSObject>
- (void)dayButtonPressed:(id)sender;
@end
@interface DayButton : UIButton {
id <DayButtonDelegate> delegate;
NSDate *buttonDate;
}
@property (nonatomic, assign) id <DayButtonDelegate> delegate;
@property (nonatomic, copy) NSDate *buttonDate;
- (id)buttonWithFrame:(CGRect)buttonFrame;
@end
在 DayButton.m 中
//
// DayButton.m
// DDCalendarView
//
//
#import "DayButton.h"
@implementation DayButton
@synthesize delegate, buttonDate;
- (id)buttonWithFrame:(CGRect)buttonFrame {
self = [DayButton buttonWithType:UIButtonTypeCustom];
self.frame = buttonFrame;
self.titleLabel.textAlignment = UITextAlignmentRight;
self.backgroundColor = [UIColor clearColor];
[self setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[self addTarget:delegate action:@selector(dayButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
UILabel *titleLabel = [self titleLabel];
CGRect labelFrame = titleLabel.frame;
int framePadding = 4;
labelFrame.origin.x = self.bounds.size.width - labelFrame.size.width - framePadding;
labelFrame.origin.y = framePadding;
[self titleLabel].frame = labelFrame;
}
- (void)dealloc {
[super dealloc];
}
@end
在 DDCalenderView.h
//
// DDCalendarView.h
// DDCalendarView
//
//
#import <UIKit/UIKit.h>
#import "DayButton.h"
@protocol DDCalendarViewDelegate <NSObject>
- (void)dayButtonPressed:(DayButton *)button;
@optional
- (void)prevButtonPressed;
- (void)nextButtonPressed;
@end
@interface DDCalendarView : UIView <DayButtonDelegate> {
id <DDCalendarViewDelegate> delegate;
NSString *calendarFontName;
UILabel *monthLabel;
NSMutableArray *dayButtons;
NSCalendar *calendar;
float calendarWidth;
float calendarHeight;
float cellWidth;
float cellHeight;
int currentMonth;
int currentYear;
}
@property(nonatomic, assign) id <DDCalendarViewDelegate> delegate;
- (id)initWithFrame:(CGRect)frame fontName:(NSString *)fontName delegate:(id)theDelegate;
- (void)updateCalendarForMonth:(int)month forYear:(int)year;
- (void)drawDayButtons;
- (void)prevBtnPressed:(id)sender;
- (void)nextBtnPressed:(id)sender;
@end
在 DDCalenderView.m
//
// DDCalendarView.m
// DDCalendarView
//
//
#import "DDCalendarView.h"
@implementation DDCalendarView
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame fontName:(NSString *)fontName delegate:(id)theDelegate {
if ((self = [super initWithFrame:frame])) {
self.delegate = theDelegate;
//Initialise vars
calendarFontName = fontName;
calendarWidth = frame.size.width;
calendarHeight = frame.size.height;
cellWidth = frame.size.width / 7.0f;
cellHeight = frame.size.height / 14.0f;
//View properties
// UIColor *bgPatternImage = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"square-paper.png"]];
//
// self.backgroundColor = bgPatternImage;
// [bgPatternImage release];
//Set up the calendar header
self.backgroundColor=[UIColor whiteColor];
UIButton *prevBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[prevBtn setImage:[UIImage imageNamed:@"left-arrow.png"] forState:UIControlStateNormal];
prevBtn.frame = CGRectMake(0, 0, cellWidth, cellHeight);
[prevBtn addTarget:self action:@selector(prevBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
UIButton *nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[nextBtn setImage:[UIImage imageNamed:@"right-arrow.png"] forState:UIControlStateNormal];
nextBtn.frame = CGRectMake(calendarWidth - cellWidth, 0, cellWidth, cellHeight);
[nextBtn addTarget:self action:@selector(nextBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
CGRect monthLabelFrame = CGRectMake(cellWidth, 0, calendarWidth - 2*cellWidth, cellHeight);
monthLabel = [[UILabel alloc] initWithFrame:monthLabelFrame];
monthLabel.font = [UIFont fontWithName:calendarFontName size:18];
monthLabel.textAlignment = UITextAlignmentCenter;
monthLabel.backgroundColor = [UIColor clearColor];
monthLabel.textColor = [UIColor blackColor];
//Add the calendar header to view
[self addSubview: prevBtn];
[self addSubview: nextBtn];
[self addSubview: monthLabel];
//Add the day labels to the view
char *days[7] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
for(int i = 0; i < 7; i++) {
CGRect dayLabelFrame = CGRectMake(i*cellWidth, cellHeight, cellWidth, cellHeight);
UILabel *dayLabel = [[UILabel alloc] initWithFrame:dayLabelFrame];
dayLabel.text = [NSString stringWithFormat:@"%s", days[i]];
dayLabel.textAlignment = UITextAlignmentCenter;
dayLabel.backgroundColor = [UIColor clearColor];
dayLabel.font = [UIFont fontWithName:calendarFontName size:16];
dayLabel.textColor = [UIColor darkGrayColor];
[self addSubview:dayLabel];
[dayLabel release];
}
[self drawDayButtons];
//Set the current month and year and update the calendar
calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *dateParts = [calendar components:unitFlags fromDate:[NSDate date]];
currentMonth = [dateParts month];
currentYear = [dateParts year];
[self updateCalendarForMonth:currentMonth forYear:currentYear];
}
return self;
}
- (void)drawDayButtons {
dayButtons = [[NSMutableArray alloc] initWithCapacity:42];
for (int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
CGRect buttonFrame = CGRectMake(j*cellWidth, (i+2)*cellHeight, cellWidth, cellHeight);
DayButton *dayButton = [[DayButton alloc] buttonWithFrame:buttonFrame];
dayButton.titleLabel.font = [UIFont fontWithName:calendarFontName size:14];
dayButton.delegate = self;
[dayButtons addObject:dayButton];
[dayButton release];
[self addSubview:[dayButtons lastObject]];
}
}
}
- (void)updateCalendarForMonth:(int)month forYear:(int)year {
char *months[12] = {"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
monthLabel.text = [NSString stringWithFormat:@"%s %d", months[month - 1], year];
//Get the first day of the month
NSDateComponents *dateParts = [[NSDateComponents alloc] init];
[dateParts setMonth:month];
[dateParts setYear:year];
[dateParts setDay:1];
NSDate *dateOnFirst = [calendar dateFromComponents:dateParts];
[dateParts release];
NSDateComponents *weekdayComponents = [calendar components:NSWeekdayCalendarUnit fromDate:dateOnFirst];
int weekdayOfFirst = [weekdayComponents weekday];
//Map first day of month to a week starting on Monday
//as the weekday component defaults to 1->Sun, 2->Mon...
if(weekdayOfFirst == 1) {
weekdayOfFirst = 7;
} else {
--weekdayOfFirst;
}
int numDaysInMonth = [calendar rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:dateOnFirst].length;
int day = 1;
for (int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
int buttonNumber = i * 7 + j;
DayButton *button = [dayButtons objectAtIndex:buttonNumber];
button.enabled = NO; //Disable buttons by default
[button setTitle:nil forState:UIControlStateNormal]; //Set title label text to nil by default
[button setButtonDate:nil];
if(buttonNumber >= (weekdayOfFirst - 1) && day <= numDaysInMonth) {
[button setTitle:[NSString stringWithFormat:@"%d", day]
forState:UIControlStateNormal];
NSDateComponents *dateParts = [[NSDateComponents alloc] init];
[dateParts setMonth:month];
[dateParts setYear:year];
[dateParts setDay:day];
NSDate *buttonDate = [calendar dateFromComponents:dateParts];
[dateParts release];
[button setButtonDate:buttonDate];
button.enabled = YES;
++day;
}
}
}
}
- (void)prevBtnPressed:(id)sender {
if(currentMonth == 1) {
currentMonth = 12;
--currentYear;
} else {
--currentMonth;
}
[self updateCalendarForMonth:currentMonth forYear:currentYear];
if ([self.delegate respondsToSelector:@selector(prevButtonPressed)]) {
[self.delegate prevButtonPressed];
}
}
- (void)nextBtnPressed:(id)sender {
if(currentMonth == 12) {
currentMonth = 1;
++currentYear;
} else {
++currentMonth;
}
[self updateCalendarForMonth:currentMonth forYear:currentYear];
if ([self.delegate respondsToSelector:@selector(nextButtonPressed)]) {
[self.delegate nextButtonPressed];
}
}
- (void)dayButtonPressed:(id)sender {
DayButton *dayButton = (DayButton *) sender;
[self.delegate dayButtonPressed:dayButton];
}
- (void)dealloc {
[calendar release];
[dayButtons release];
[super dealloc];
}
@end
在 MainViewController.h
//
// MainViewController.h
// DDCalendarView
//
//
#import <UIKit/UIKit.h>
#import "DDCalendarView.h"
@interface MainViewController : UIViewController <DDCalendarViewDelegate> {
DDCalendarView *calendarView;
}
@end
在 MainVIewController.m
//
// MainViewController.m
// DDCalendarView
//
//
#import "MainViewController.h"
@implementation MainViewController
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
UIView *appView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
calendarView = [[DDCalendarView alloc] initWithFrame:appView.bounds fontName:@"AmericanTypewriter" delegate:self];
self.view = appView;
[appView release];
[self.view addSubview: calendarView];
}
- (void)dayButtonPressed:(DayButton *)button {
//For the sake of example, we obtain the date from the button object
//and display the string in an alert view
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
NSString *theDate = [dateFormatter stringFromDate:button.buttonDate];
[dateFormatter release];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterLongStyle];
NSString *theDate = [dateFormatter stringFromDate:button.buttonDate];
[dateFormatter release];
// UIAlertView *dateAlert = [[UIAlertView alloc]
// initWithTitle:@"Date Pressed"
// message:theDate
// delegate:self
// cancelButtonTitle:@"Ok"
// otherButtonTitles:nil];
// [dateAlert show];
// [dateAlert release];
//
timeEntry *time=[[timeEntry alloc]init];
[time setDate:theDate];
[self.navigationController pushViewController:time animated:YES];
[time release];
}
- (void)nextButtonPressed {
NSLog(@"Next...");
}
- (void)prevButtonPressed {
NSLog(@"Prev...");
}
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
我在日历上方拍了一张图片。如果用户选择日期,则图像必须以水平或垂直位置移动到该日期。是否需要动画?如果是,如何处理,否则任何人都可以以自己的方式提供帮助。请.伟大的答案将不胜感激。