3

非推奨の API を使用せずに複数行のテキストをドロップ シャドウで描画しようとしています。1行で問題なく動作します。関連するコードは次のようになります。

-(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 で複数行のテキストに影が表示されない

xCode 6 でビルドした iPhone 5 (7.1.2)、iPhone 6 (8.0) でこれをテストしました。また、xCode 5 でビルドしたときに iPhone 5 でもテストしました。

4

1 に答える 1

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];

これはどこにも文書化されていないと思いますが、そうでなければ聞きたいです。

于 2014-09-24T11:51:32.800 に答える