2013-10-18 43 views
38

這種方法在iOS的7.0棄用:如何使用drawInRect:withAttributes:不是drawAtPoint:forWidth:withFont:字體:lineBreakMode:baselineAdjustment:在iOS的7

drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment: 

現在使用drawInRect:withAttributes:代替。

我找不到fontSize和baselineAdjustment的attributeName。

編輯

感謝@Puneet回答。

其實,我的意思是如果沒有這些鍵,如何在iOS 7中實現這個方法?

像下面的方法:

+ (CGSize)drawWithString:(NSString *)string atPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font fontSize:(CGFloat)fontSize 
      lineBreakMode:(IBLLineBreakMode)lineBreakMode 
     baselineAdjustment:(UIBaselineAdjustment)baselineAdjustment { 
    if (iOS7) { 
     CGRect rect = CGRectMake(point.x, point.y, width, CGFLOAT_MAX); 

     NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
     paragraphStyle.lineBreakMode = lineBreakMode; 

     NSDictionary *attributes = @{NSFontAttributeName: font, NSParagraphStyleAttributeName: paragraphStyle}; 

     [string drawInRect:rect withAttributes:attributes]; 

     size = CGSizeZero; 
    } 
    else { 
     size = [string drawAtPoint:point forWidth:width withFont:font fontSize:fontSize lineBreakMode:lineBreakMode baselineAdjustment:baselineAdjustment]; 
    } 
    return size; 
} 

我不知道如何通過fontSizebaselineAdjustment

attributes字典。

例如

NSBaselineOffsetAttributeName密鑰應通過NSNumer它,但baselineAdjustmentEnum

是否有其他方式來傳遞這兩個變量?

+0

常量在UIKit添加到'NSAttributedString'的文檔中列出。 – rmaddy

+1

謝謝,我也知道這一點,但我不知道如何在iOS 7中實現此方法。 – Vincent

回答

37

您可以使用NSDictionary和應用的屬性是這樣的:

NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:14.0]; 

NSDictionary *attrsDictionary = 

[NSDictionary dictionaryWithObjectsAndKeys: 
           font, NSFontAttributeName, 
           [NSNumber numberWithFloat:1.0], NSBaselineOffsetAttributeName, nil]; 

使用attrsDictionary作爲參數。

參見:Attributed String Programming Guide

參見:Standard Attributes

SWIFT: IN 字符串 drawInRect不可用,但我們可以用的NSString代替:

let font = UIFont(name: "Palatino-Roman", size: 14.0) 
let baselineAdjust = 1.0 
let attrsDictionary = [NSFontAttributeName:font, NSBaselineOffsetAttributeName:baselineAdjust] as [NSObject : AnyObject] 
let str:NSString = "Hello World" 
str.drawInRect(CGRectZero, withAttributes: attrsDictionary) 
+1

請再次閱讀該問題。 OP正在尋找兩個特定的屬性鍵。 – rmaddy

+0

如果不難,你能不能更新一下呢? –

+0

如何讓字符串多行? –

33

這是一個比以前複雜一點,你不能選擇最小的字體大小,但必須使用最小的字體比例因子。 iOS SDK中也存在一個缺陷,它在大多數使用情況下都會打破它(請參閱底部的註釋)。這裏是你必須做的:

// Create text attributes 
NSDictionary *textAttributes = @{NSFontAttributeName: [UIFont systemFontOfSize:18.0]}; 

// Create string drawing context 
NSStringDrawingContext *drawingContext = [[NSStringDrawingContext alloc] init]; 
drawingContext.minimumScaleFactor = 0.5; // Half the font size 

CGRect drawRect = CGRectMake(0.0, 0.0, 200.0, 100.0); 
[string drawWithRect:drawRect 
      options:NSStringDrawingUsesLineFragmentOrigin 
      attributes:textAttributes 
      context:drawingContext]; 

注:

  • 似乎是在iOS的7 SDK中的錯誤至少到7.0.3版本:如果指定自定義字體的屬性中,miniumScaleFactor將被忽略。如果您通過nil屬性,文本正確縮放。

  • NSStringDrawingUsesLineFragmentOrigin選項很重要。它告訴文本繪圖系統,繪圖矩形的原點應該在左上角。

  • 無法使用新方法設置基線調整。您必須先通過調用boundingRectWithSize:options:attributes:context:然後調整矩形,然後將其傳遞給drawWithRect:options:attributes:context

+3

更好的答案。快速注意,您可以使用NSBaselineOffsetAttributeName調整基線,但只有負值才能使文本向下移動。將正文向上移動的正值被限制爲零。 – Benjohn

相關問題