2014-09-24 36 views
3

我想要使用陰影繪製多行文本而不使用不贊成使用的API。它適用於單行。相關的代碼看起來是這樣的:無法在多行nsstring上得到陰影

-(void)drawRect:(CGRect)rect 
{ 
    NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy]; 
    paragraph.lineBreakMode = NSLineBreakByWordWrapping; 
    paragraph.alignment = NSTextAlignmentCenter; 

    UIFont *f = [UIFont systemFontOfSize:20.0]; 
    NSMutableDictionary *attributes = [NSMutableDictionary new]; 
    [attributes setValuesForKeysWithDictionary:@{ NSFontAttributeName : f, 
                NSParagraphStyleAttributeName : paragraph, 
                NSForegroundColorAttributeName : [UIColor blueColor] }]; 
    NSShadow * shadow = [NSShadow new]; 
    shadow.shadowOffset = CGSizeMake(4,4); 
    shadow.shadowColor = [UIColor redColor]; 

    [attributes setValue:shadow forKey:NSShadowAttributeName]; 

    rect.origin.y = 100; 
    [@"test string on one line" drawInRect:rect withAttributes:attributes]; 

    rect.origin.y = 150; 
    [@"test string spanning more than one line" drawInRect:rect withAttributes:attributes]; 
} 

和輸出看起來像這樣:

iPhone 6 showing no shadow on multiline text

我已經在iPhone 5(7.1.2),iPhone 6(8.0),建築測試這與xCode 6.我也測試了它在iPhone 5上使用xCode 5構建時。

+0

哎呀,我會剛剛使用兩個相同的標籤,一個疊加另一個和偏移量,透明背景。 – 2014-09-24 12:26:04

+0

這對於非零的shadowBlurRadius會起作用嗎? – 2014-09-24 12:28:33

回答

6

一些更多的實驗,我發現答案是使用NSAttributedString。

雖然這並不表明影子:

NSString *s = @"test string spanning more than one line" 
    [s drawInRect:rect withAttributes:attributes] 

這並不:

NSAttributedString *as = [[NSAttributedString alloc] initWithString:s attributes:attributes]; 
    [as drawInRect:rect]; 

我不認爲是記錄任何地方,很想否則聽到。

+0

人們應該認爲,在OS X初始版發佈16年後,他們應該得到一份關於NSAttributedString及其屬性的體面文檔。不。順便說一句,你爲我節省了很多麻煩。 – 2016-09-10 19:56:31