转载4

24、CoreText基础-字体必修课

转自:http://www.dreamingwish.com/dream-2011/coretext-ji-chu-font-basis.html

介绍一些字体的术语,以及对应的英文名称

字体(Font):是一系列字号、样式和磅值相同的字符(例如:10磅黑体Palatino)。现多被视为字样的同义词

字面(Face):是所有字号的磅值和格式的综合

字体集(Font family):是一组相关字体(例如:Franklin family包括Franklin Gothic、Fran-klinHeavy和Franklin Compressed)

磅值(Weight):用于描述字体粗度。典型的磅值,从最粗到最细,有极细、细、book、中等、半粗、粗、较粗、极粗

样式(Style):字形有三种形式:Roman type是直体;oblique type是斜体;utakuc type是斜体兼曲线(比Roman type更像书法体)。

x高度(X height):指小写字母的平均高度(以x为基准)。磅值相同的两字母,x高度越大的字母看起来比x高度小的字母要大

Cap高度(Cap height):与x高度相似。指大写字母的平均高度(以C为基准)

下行字母(Descender):例如在字母q中,基线以下的字母部分叫下伸部分

上行字母(Ascender):x高度以上的部分(比如字母b)叫做上伸部分

基线(Baseline):通常在x、v、b、m下的那条线

描边(Stroke):组成字符的线或曲线。可以加粗或改变字符形状

衬线(Serif):用来使字符更可视的一条水平线。如字母左上角和下部的水平线。

无衬线(Sans Serif):可以让排字员不使用衬线装饰。

方形字(Block):这种字体的笔画使字符看起来比无衬线字更显眼,但还不到常见的衬线字的程度。例如Lubalin Graph就是方形字,这种字看起来好像是木头块刻的一样

手写体脚本(Calligraphic script):是一种仿效手写体的字体。例如Murray Hill或者Fraktur字体

艺术字(Decorative):像绘画般的字体

Pi符号(Pisymbol):非标准的字母数字字符的特殊符号。例如Wingdings和Mathematical Pi

连写(Ligature):是一系列连写字母如fi、fl、ffi或ffl。由于字些字母形状的原因经常被连写,故排字员已习惯将它们连写。

25、准确计算CoreText高度的方法

- (int)getAttributedStringHeightWithString:(NSAttributedString *)  string  WidthValue:(int) width
{
   int total_height = 0;
   
   CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)string);    //string 为要计算高度的NSAttributedString
   CGRect drawingRect = CGRectMake(0, 0, width, 1000);  //这里的高要设置足够大
   CGMutablePathRef path = CGPathCreateMutable();
   CGPathAddRect(path, NULL, drawingRect);
   CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);
   CGPathRelease(path);
   CFRelease(framesetter);
   
   NSArray *linesArray = (NSArray *) CTFrameGetLines(textFrame);
   
   CGPoint origins[[linesArray count]];
   CTFrameGetLineOrigins(textFrame, CFRangeMake(0, 0), origins);
   
   int line_y = (int) origins[[linesArray count] -1].y;  //最后一行line的原点y坐标
   
   CGFloat ascent;
   CGFloat descent;
   CGFloat leading;
   
   CTLineRef line = (CTLineRef) [linesArray objectAtIndex:[linesArray count]-1];
   CTLineGetTypographicBounds(line, &ascent, &descent, &leading);
   
   total_height = 1000 - line_y + (int) descent +1;    //+1为了纠正descent转换成int小数点后舍去的值
   
   CFRelease(textFrame);
   
   return total_height;
   
}

 

//关于line坐标位置y为下图黑线所在位置 descent为黑线下部分字体的高度

//关于字体各部分高度说明  http://ios-iphone.diandian.com/post/2012-03-29/18055023  

26、自定义拷贝、粘贴窗口

(1)、重写canBecomeFirstResponder方法

  - (BOOL)canBecomeFirstResponder{
  
  [super canBecomeFirstResponder];
  return YES;
}

(2)、创建自定义UIMenuController

  UIMenuItem *share = [[UIMenuItem alloc] initWithTitle:@"分享" action:@selector(share:)];
   UIMenuItem *email = [[UIMenuItem alloc] initWithTitle:@"邮件" action:@selector(email:)];
   UIMenuItem *print = [[UIMenuItem alloc] initWithTitle:@"打印" action:@selector(print:)];

   UIMenuController *menu = [UIMenuController sharedMenuController];
   [menu setMenuItems:[NSArray arrayWithObjects:share, email,print, nil]];
   [menu setTargetRect:self.frame inView:self.superview];
   [menu setMenuVisible:YES animated:YES];

(3)、判断显示哪个menu

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
  [super canPerformAction:action withSender:sender];
 
  if ( action == @selector(share:) || action == @selector(email:) || action == @selector(print:))
  {
      return YES;    
  }
  else
  {
      return NO;
  }
}

 

27、iOS本地推送通知方法

  
可在应用后台执行时,本地弹出推送通知,也可以定时触发推送。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
   
   UIDevice* device = [UIDevice currentDevice];
   
   BOOL backgroundSupported = NO;
   
   if ([device respondsToSelector:@selector(isMultitaskingSupported)])
   {    
       backgroundSupported = device.multitaskingSupported;
   }
   if (backgroundSupported && _bgTask==UIBackgroundTaskInvalid)
   {
       UIApplication *app = [UIApplication sharedApplication];
       
       _bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
       }];  
       
       
       dispatch_async(dispatch_get_main_queue(), ^{
           
           while (app.applicationState==UIApplicationStateBackground && _bgTask!=UIBackgroundTaskInvalid  && [app backgroundTimeRemaining] > 10)  
           {
               [NSThread sleepForTimeInterval:1];
               NSLog(@"background task %d left left  time %d.", _bgTask, (int)[app backgroundTimeRemaining]);
                               
               if ([app backgroundTimeRemaining] < 580)
               {
                   UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                   if (localNotif)
                   {
                       localNotif.alertBody = [NSString stringWithString:@"测试本地通知消息,后台提示功能。"];
                       localNotif.alertAction = NSLocalizedString(@"查看", nil);
                       localNotif.soundName = UILocalNotificationDefaultSoundName;
                       localNotif.applicationIconBadgeNumber = 1;            
                       [application presentLocalNotificationNow:localNotif];
                       [localNotif release];
                       break;
                   }
               }
           }
           
           NSLog(@"background task %d finished.", _bgTask);     
           [app endBackgroundTask:_bgTask];
           _bgTask = UIBackgroundTaskInvalid;   
              
       });      
   }

}

28、CoreText绘制文本出现行间距不等及解决办法

转自: http://willonboy.tk/?p=1163


 

最终在http://www.cocoanetics.com/2012/02/radar-coretext-line-spacing-bug/

找到了DTCoreText库

Radar: “CoreText Line Spacing Bug” b 05, 2012

I finally got around to report an annoying bug in CoreText that has been bugging us in DTCoreText until I wrote a method to correct line origins as a workaround. rdar://10810114

The annoying thing about this bug is that it adds visual noise to otherwise pristinely rendered text. Especially on larger font sizes you see that additional space appears before each CTLine that ends with a paragraph break (\n).

UPDATE: This is a duplicate of rdar://9931615.

CoreText Line Spacing BugSummary

CoreText inserts too much space before any line that ends with a \n. This extra space depends on the font and font size. On large print this causes visual noise by not being uniform.

Steps to Reproduce

Create a CTFrame from a CTFrameSetter with a string that is long enough to wrap and that contains paragraph breaks. Use a non-UI font, like for example AriaMT.

Expected Results

Line origins should be spaced by exactly the same distance for identical text and identical attributes.

Actual Results

Each line that ends with a paragraph break is shifted down. With the system UI font, size 54 baselines are spaced exactly 64 pixels apart. With ArialMT, size 54, baseline spacing differs between 62 and 65.

Regression

This has been a bug since before iOS 4.3.

Notes

This does not occur with all fonts, Using a system font the spacing is precisely correct. I have attached a project to demonstrate the issue. See TextView.m.

It appears that the text metrics for an (invisible) paragraph glyph are miscalculated. Since the glyph is not visible you’d expect neither and ascender nor descender value. But instead the descender is too large. If you walk through the entire line and get the maximum ascenders and descenders the value is correct if you omit the \n in this calculation.

In short: A trailing \n messes up the font metrics for the entire CTLine.

Attachment: CoreTextLineOrigins Demo Project



NSString 转换 NSdate

    NSString *myDateString = @"2010-12-08";
    //拿到原先的日期格式
    NSDateFormatter *inputFormat = [[NSDateFormatter alloc] init];
    [inputFormat setDateFormat:@"yyyy-MM-dd"]; //2010-12-08 06:53:43
    
    //将NSString转换为NSDate
    NSDate *theDate  = [inputFormat dateFromString:myDateString];

 

    //前一天
    theDate = [[NSDate alloc] initWithTimeInterval:-24*3600 sinceDate:theDate];


  //后一天
    theDate = [[NSDate alloc] initWithTimeInterval:24*3600 sinceDate:theDate];    //设置新的日期格式


    NSDateFormatter *outputFormat = [[NSDateFormatter alloc] init];
    [outputFormat setDateFormat:@"yyyy-MM-dd"];
    
    //将NSDate转换为NSString
    NSString *myNewDateString = [outputFormat stringFromDate:theDate];//2010-12-08 06:53:43 GMT
    
    NSLog(@"%@",myNewDateString);



时区日期处理及定时 (NSDate,NSCalendar,NSTimer,NSTimeZone) -- IOS(实例)

    博客分类: 
  • IOS / Objective-C
 

NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间

 

Dates

        NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能。Date对象是不可改变的。

        如果你要创建date对象并表示当前日期,你可以alloc一个NSDate对象并调用init初始化:

C代码   收藏代码
  1. NSDate *now = [[NSDate alloc] init];    
  

          或者使用NSDate的date类方法来创建一个日期对象。如果你需要与当前日期不同的日期,你可以使用NSDate的initWithTimeInterval...或dateWithTimeInterval...方法,你也可以使用更复杂的calendar或date components对象。

 

        创建一定时间间隔的NSDate对象:

C代码   收藏代码
  1. NSTimeInterval secondsPerDay = 24 * 60 * 60;    
  2.     
  3. NSDate *tomorrow = [[NSDate alloc] initWithTimeIntervalSinceNow:secondsPerDay];    
  4.     
  5. NSDate *yesterday = [[NSDate alloc] initWithTimeIntervalSinceNow:-secondsPerDay];    
  6.     
  7. [tomorrow release];    
  8. [yesterday release];    
  

        使用增加时间间隔的方式来生成NSDate对象:

C代码   收藏代码
  1. NSTimeInterval secondsPerDay = 24 * 60 * 60;    
  2.     
  3. NSDate *today = [[NSDate alloc] init];    
  4. NSDate *tomorrow, *yesterday;    
  5.     
  6. tomorrow = [today dateByAddingTimeInterval: secondsPerDay];    
  7. yesterday = [today dateByAddingTimeInterval: -secondsPerDay];    
  8.     
  9. [today release];    

 

        如果要对NSDate对象进行比较,可以使用isEqualToDate:, compare:, laterDate:和 earlierDate:方法。这些方法都进行精确比较,也就是说这些方法会一直精确比较到NSDate对象中秒一级。例如,你可能比较两个日期,如果他们之间的间隔在一分钟之内则认为这两个日期是相等的。在这种情况下使用,timeIntervalSinceDate:方法来对两个日期进行比较。下面的代码进行了示例:

C代码   收藏代码
  1. if (fabs([date2 timeIntervalSinceDate:date1]) < 60) ...   
 

NSCalendar & NSDateComponents

 

        日历对象封装了对系统日期的计算,包括这一年开始,总天数以及划分。你将使用日历对象对绝对日期与date components(包括年,月,日,时,分,秒)进行转换。

 

        NSCalendar定义了不同的日历,包括佛教历,格里高利历等(这些都与系统提供的本地化设置相关)。NSCalendar与NSDateComponents对象紧密相关。

 

        你可以通过NSCalendar对象的currentCalendar方法来获得当前系统用户设置的日历。

C代码   收藏代码
  1. NSCalendar *currentCalendar = [NSCalendar currentCalendar];    
  2. NSCalendar *japaneseCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSJapaneseCalendar];    
  3. NSCalendar *usersCalendar = [[NSLocale currentLocale] objectForKey:NSLocaleCalendar];    
 

        usersCalendar和currentCalendar对象是相等的,尽管他们是不同的对象。

 

        你可以使用NSDateComponents对象来表示一个日期对象的组件——例如年,月,日和小时。如果要使一个NSDateComponents对象有意义,你必须将其与一个日历对象相关联。下面的代码示例了如何创建一个NSDateComponents对象:

C代码   收藏代码
  1. NSDateComponents *components = [[NSDateComponents alloc] init];    
  2.     
  3. [components setDay:6];    
  4. [components setMonth:5];    
  5. [components setYear:2004];    
  6.     
  7. NSInteger weekday = [components weekday]; // Undefined (== NSUndefinedDateComponent)    
 

        要将一个日期对象解析到相应的date components,你可以使用NSCalendar的components:fromDate:方法。此外日期本身,你需要指定NSDateComponents对象返回组件。

C代码   收藏代码
  1. NSDate *today = [NSDate date];    
  2.     
  3. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  4.     
  5. NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:today];    
  6.     
  7. NSInteger day = [weekdayComponents day];    
  8. NSInteger weekday = [weekdayComponents weekday];  
 

同样你也可以从NSDateComponents对象来创建NSDate对象:  

C代码   收藏代码
  1. NSDateComponents *components = [[NSDateComponents alloc] init];    
  2.     
  3. [components setWeekday:2]; // Monday    
  4. [components setWeekdayOrdinal:1]; // The first Monday in the month    
  5. [components setMonth:5]; // May    
  6. [components setYear:2008];    
  7.     
  8. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  9.     
  10. NSDate *date = [gregorian dateFromComponents:components];    
 

        为了保证正确的行为,您必须确保使用的组件在日历上是有意义的。指定“出界”日历组件,如一个-6或2月30日在公历中的日期值产生未定义的行为。

 

        你也可以创建一个不带年份的NSDate对象,这样的操作系统会自动生成一个年份,但在后面的代码中不会使用其自动生成的年份。

C代码   收藏代码
  1. NSDateComponents *components = [[NSDateComponents alloc] init];    
  2.     
  3. [components setMonth:11];    
  4. [components setDay:7];    
  5.     
  6. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  7.     
  8. NSDate *birthday = [gregorian dateFromComponents:components];   
 

下面的示例显示了如何从一个日历置换到另一个日历:

C代码   收藏代码
  1. NSDateComponents *comps = [[NSDateComponents alloc] init];    
  2.     
  3. [comps setDay:6];    
  4. [comps setMonth:5];    
  5. [comps setYear:2004];    
  6.     
  7. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  8.     
  9. NSDate *date = [gregorian dateFromComponents:comps];    
  10.     
  11. [comps release];    
  12. [gregorian release];    
  13.     
  14. NSCalendar *hebrew = [[NSCalendar alloc] initWithCalendarIdentifier:NSHebrewCalendar];    
  15.     
  16. NSUInteger unitFlags = NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;    
  17.     
  18. NSDateComponents *components = [hebrew components:unitFlags fromDate:date];    
  19.     
  20. NSInteger day = [components day]; // 15    
  21. NSInteger month = [components month]; // 9    
  22. NSInteger year = [components year]; // 5764    
 

历法计算

 

    在当前时间加上一个半小时:

C代码   收藏代码
  1. NSDate *today = [[NSDate alloc] init];    
  2.     
  3. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  4.     
  5. NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];    
  6.     
  7. [offsetComponents setHour:1];    
  8. [offsetComponents setMinute:30];    
  9.     
  10. // Calculate when, according to Tom Lehrer, World War III will end    
  11. NSDate *endOfWorldWar3 = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0];    
 

    获得当前星期中的星期天(使用格里高利历):

C代码   收藏代码
  1. NSDate *today = [[NSDate alloc] init];    
  2.     
  3. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  4.     
  5. // Get the weekday component of the current date    
  6. NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:today];    
  7.     
  8. /*   
  9. Create a date components to represent the number of days to subtract from the current date.   
  10.    
  11. The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question.  (If today is Sunday, subtract 0 days.)   
  12. */    
  13.     
  14. NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init];    
  15.     
  16. [componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)];    
  17.     
  18. NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract toDate:today options:0];    
  19.     
  20. /*   
  21. Optional step:   
  22. beginningOfWeek now has the same hour, minute, and second as the original date (today).   
  23.    
  24. To normalize to midnight, extract the year, month, and day components and create a new date from those components.   
  25. */    
  26.     
  27. NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate: beginningOfWeek];    
  28.     
  29. beginningOfWeek = [gregorian dateFromComponents:components];    
 

    如何可以计算出一周的第一天(根据系统的日历设置):

C代码   收藏代码
  1. NSDate *today = [[NSDate alloc] init];    
  2.     
  3. NSDate *beginningOfWeek = nil;    
  4.     
  5. BOOL ok = [gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek interval:NULL forDate: today];    
 

    获得两个日期之间的间隔:

C代码   收藏代码
  1. NSDate *startDate = ...;    
  2. NSDate *endDate = ...;    
  3.     
  4. NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];    
  5.     
  6. NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;    
  7.     
  8. NSDateComponents *components = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0];    
  9.     
  10. NSInteger months = [components month];    
  11. NSInteger days = [components day];  
 

    使用Category来计算同一时代(AD|BC)两个日期午夜之间的天数:

C代码   收藏代码
  1. @implementation NSCalendar (MySpecialCalculations)    
  2.     
  3. -(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate {    
  4.      NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:startDate];    
  5.     
  6.      NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:endDate];    
  7.     
  8.      return endDay-startDay;    
  9. }    
  10.     
  11. @end    
 

    使用Category来计算不同时代(AD|BC)两个日期的天数:

C代码   收藏代码
  1. @implementation NSCalendar (MyOtherMethod)    
  2.     
  3. -(NSInteger) daysFromDate:(NSDate *) startDate toDate:(NSDate *) endDate {    
  4.     
  5.      NSCalendarUnit units=NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;    
  6.     
  7.      NSDateComponents *comp1=[self components:units fromDate:startDate];    
  8.      NSDateComponents *comp2=[self components:units fromDate endDate];    
  9.     
  10.      [comp1 setHour:12];    
  11.      [comp2 setHour:12];    
  12.     
  13.      NSDate *date1=[self dateFromComponents: comp1];    
  14.      NSDate *date2=[self dateFromComponents: comp2];    
  15.     
  16.      return [[self components:NSDayCalendarUnit fromDate:date1 toDate:date2 options:0] day];    
  17. }    
  18.     
  19. @end   

 

    判断一个日期是否在当前一周内(使用格里高利历):

C代码   收藏代码
  1. -(BOOL)isDateThisWeek:(NSDate *)date {    
  2.     
  3.      NSDate *start;    
  4.      NSTimeInterval extends;    
  5.     
  6.      NSCalendar *cal=[NSCalendar autoupdatingCurrentCalendar];    
  7.      NSDate *today=[NSDate date];    
  8.     
  9.      BOOL success= [cal rangeOfUnit:NSWeekCalendarUnit startDate:&start interval: &extends forDate:today];    
  10.     
  11.      if(!success)    
  12.         return NO;    
  13.     
  14.      NSTimeInterval dateInSecs = [date timeIntervalSinceReferenceDate];    
  15.      NSTimeInterval dayStartInSecs= [start timeIntervalSinceReferenceDate];    
  16.     
  17.      if(dateInSecs > dayStartInSecs && dateInSecs < (dayStartInSecs+extends)){    
  18.           return YES;    
  19.      }    
  20.      else {    
  21.           return NO;    
  22.      }    
  23. }    
 

 

来源:http://blog.csdn.net/lingedeng/article/details/6996599

 

 

 

1、获取当前时间

 

C代码   收藏代码
  1. NSDateFormatter*formatter = [[NSDateFormatteralloc] init];  
  2. [formatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];  
  3. NSString *locationString=[formatter stringFromDate: [NSDate date]];  
 

另外的方法:

 

C代码   收藏代码
  1. -(NSString *)getDate  
  2. {  
  3. NSDateFormatter*formatter = [[NSDateFormatteralloc] init];  
  4. [formatter setDateFormat:@"yyyy-MM-dd EEEE HH:mm:ss a"];  
  5. NSString *locationString=[formatter stringFromDate: [NSDate date]];  
  6. [formatter release];  
  7. return locationString;  
  8. }  
 

//大写的H日期格式将默认为24小时制,小写的h日期格式将默认为12小时

//不需要特别设置,只需要在dataFormat里设置类似"yyyy-MMM-dd"这样的格式就可以了

 

日期格式如下:

y  年  Year  1996; 96  

M  年中的月份  Month  July; Jul; 07  

w  年中的周数  Number  27  

W  月份中的周数  Number  2  

D  年中的天数  Number  189  

d  月份中的天数  Number  10  

F  月份中的星期  Number  2  

E  星期中的天数  Text  Tuesday; Tue  

a  Am/pm 标记  Text  PM  

H  一天中的小时数(0-23)  Number  0  

k  一天中的小时数(1-24)  Number  24  

K  am/pm 中的小时数(0-11)  Number  0  

h  am/pm 中的小时数(1-12)  Number  12  

m  小时中的分钟数  Number  30  

s  分钟中的秒数  Number  55  

S  毫秒数  Number  978  

z  时区  General time zone  Pacific Standard Time; PST; GMT-08:00  

Z  时区  RFC 822 time zone  -0800

 

2、NSTimer定时器的基本操作方式

NSTimer是Cocoa中比较常用的定时器类,基本操作如下:

handleTimer方法可以自行定义。在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次。

 

C代码   收藏代码
  1.  - (void) handleTimer: (NSTimer *) timer  
  2. {  
  3.    //在这里进行处理  
  4. }   
  5. NSTimer *timer;  
  6. timer = [NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(handleTimer:)userInfo: nil repeats: YES];  
 

3、定时器

设置定时器下面显示的定时器将在一秒钟后触发,并一直重复直到定时器被禁用。定时器每次激活时,就会调用发送选择器消息的目标来进行初始化。回调方法带有一个参数,就是定时器本身.要禁用一个定时器,给它发送invalidate消息,这将释放定时器对象并把它从当前运行循环中删除。

C代码   收藏代码
  1. NSTime *timer ;  
  2. timer = [NSTimer scheduledTimerWithTimeInterval:1.0target:self selector:@selector(handlTimer:) userInfo:nilrepeats:YES];  
  3.   
  4. - (void)handleTimer:(NSTimer *)timer{  
  5. printf("timer count: %d", count++);  
  6. if(count > 3)  
  7. {  
  8. [timer invalidate];  
  9. }  

 

来源: http://blog.csdn.net/imekong/article/details/7041312

 

 

1. 使用 NSTimeZone 取得世界各地时间的方法

 下列程式码将示范,如何利用 NSTimeZone 取得世界上已知的时区名称,并且透过这些名称来获得当地时间,如果在系统时间的取得上有任何疑问,可以参考取得 iOS 系统日期与星期的方法一文,其程式码如下。

C代码   收藏代码
  1. //取得目前已知的所有地里名称  
  2. NSArray *timeZoneNames = [NSTimeZone knownTimeZoneNames];   
  3.   
  4. //取得本地目前时间  
  5. NSDate *date = [NSDate date];   
  6.   
  7. for(NSString *name in timeZoneNames) {   
  8. NSTimeZone *timezone = [[NSTimeZone alloc] initWithName:name];   
  9. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];   
  10.   
  11. //设定时间格式  
  12. [formatter setDateFormat:@"YYYY-MM-d HH:mm:ss"];   
  13.   
  14. //设定时区  
  15. [formatter setTimeZone:timezone];   
  16.   
  17. //时间格式正规化并做时区校正  
  18. NSString *correctDate = [formatter stringFromDate:date];  
  19.   
  20. NSLog(@"地点:%@ 当地时间:%@",[timezone name], correctDate);   
  21.   
  22. [formatter release];   
  23. [timezone release];   
  24. }  
 

 由于能取得的地点相当多,下图只是部份的执行结果。

 

 

 

来源: http://furnacedigital.blogspot.com/2011/10/nstimezone.html

 

 

2. 取得 iOS 系统日期与星期的方法

 

 

 在之前的文章中已经说明如何取得 Device 里的 iOS 系统时间,在此将在示范如何使用 NSDate 取得系统的日期与星期,请看以下程式码。

C代码   收藏代码
  1. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  2. NSDate *date = [NSDate date];   
  3.   
  4. //正规化的格式设定  
  5. [formatter setDateFormat:@"YYYY-MM-dd' 'EEEE"];  
  6.   
  7. //正规化取得的系统时间并显示  
  8. dateLabel.text = [formatter stringFromDate:date];  
 

当然 NSFormatter 能正规化的格式不只这些,想知道其他的参数可以参考关于 NSDateFormatter 的二三事一文。

 

3. 取得 iOS 系统时间的方法

 

 

 如何取得 Device 里的 iOS 系统时间,可以参考以下程式码。

C代码   收藏代码
  1. NSDateFormatter *formatter = [[NSDateFormatter alloc] init];  
  2. NSDate *date = [NSDate date];  
  3.   
  4. //正规化的格式设定  
  5. [formatter setTimeStyle:NSDateFormatterFullStyle];  
  6.   
  7. //正规化取得的系统时间并显示  
  8. timeLabel.text = [formatter stringFromDate:date];  
  9.   
  10. [formatter release];  
 

 在时间格式正规化的部份也有多种样式可供选择,其样式如下。

C代码   收藏代码
  1. [formatter setTimeStyle:NSDateFormatterFullStyle];  
  2. [formatter setTimeStyle:NSDateFormatterLongStyle];  
  3. [formatter setTimeStyle:NSDateFormatterMediumStyle];  
  4. [formatter setTimeStyle:NSDateFormatterShortStyle];  
 

最后,如果要让时间与现实时间同步可以考虑实做计时器 Timer 来解决此问题,详细的设定方式可参阅 Timer / 计时器的基本使用方法。

 

来源:http://furnacedigital.blogspot.com/2011/01/blog-post.html#more

 

 

4. Timer / 计时器的基本使用方法

 这里介绍 Timer 的基本使用方法,首先设定 Timer 的相关的参数,程式码如下。(View-based Template)

C代码   收藏代码
  1. //自行定义的函式,用来设定使用Timer/计时器的相关参数  
  2. -(void)initializeTimer {  
  3.   
  4. //设定Timer触发的频率,每秒30次  
  5. float theInterval = 1.0/30.0;  
  6. fpsLabel.text = [NSString stringWithFormat:@"%0.3f", theInterval];  
  7.   
  8. //正式启用Timer,selector是设定Timer触发时所要呼叫的函式  
  9. [NSTimer scheduledTimerWithTimeInterval:theInterval   
  10. target:self  
  11. selector:@selector(countTotalFrames:)   
  12. userInfo:nil  
  13. repeats:YES];  
  14. }  
 

   上述程式码,已经完成 Timer 的基本设定,而下列程式码则是 Timer 触发时所呼叫的函式写法。

C代码   收藏代码
  1. -(void)countTotalFrames:(NSTimer *)theTimer {  
  2. frameCount ++;  
  3. framesLabel.text = [NSString stringWithFormat:@"%d", frameCount];  
  4. }  
 

 最后,别忘记在程式进入点这边要呼叫自行定义的 initializeTimer 函式,才能让 Timer 运作。



你可能感兴趣的:(application,action,Path,email,menu,distance)