一些常见的知识(四)

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库


转载于:https://my.oschina.net/hantianyu/blog/368553

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值