

お世話になります。  
iOSアプリでUIImageに直接文字を書き入れるような動作があるアプリを製作中なのですが、その文字に影をいれようとしたところ、上手く動作しませんでした。  
文字列の背景色を設定するオプションなどは正常に動作します。

上記問題を解決するには、どのような方法があるでしょうか。  
何卒、ご協力ください。

開発環境は

  * Xcode 8.3.3

  * Swift 3.1

  * iPhone6s(iOS10.1.1), iPhone6Plus(10.2.1)

です。

ソースコード及び引数、返却値は下記の通りです。

引数

  * text:String 描画する文字列です。

  * image:UIImage この画像に文字列を描画します。

返却値

  * newImage ここに文字描画後の画像を代入することが目的となります。

ソース

[code]

        let font = UIFont.boldSystemFont(ofSize: 20)
    
        let imageWidth = image.size.width
        let imageHeight = image.size.height
    
        let rect = CGRect(x:0, y:0, width:imageWidth, height:imageHeight)
    
        UIGraphicsBeginImageContextWithOptions(image.size, false, 0)
    
        image.draw(in: rect)
    
        let textRect  = CGRect(x:0, y:0, width:imageWidth, height:imageHeight)
        let textStyle = NSMutableParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
    
        let shadow = NSShadow()
        shadow.shadowColor = UIColor.red
        shadow.shadowOffset = CGSize(width: 50, height: 30)
        shadow.shadowBlurRadius = 1
    
        let textFontAttributes = [
            NSFontAttributeName: font,
            NSForegroundColorAttributeName: UIColor.black,
            NSParagraphStyleAttributeName: textStyle,
            NSShadowAttributeName:shadow
        ]
    
        text.draw(in: textRect, withAttributes: textFontAttributes)
    
        let newImage = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext()
    
[/code]


CC BY-SA 3.0
2017-09-13T01:21:04.607
37906
2018-10-20T02:00:38.330
2017-09-13T04:23:50.963
10065
10065
question
swift ios swift3 uiimage ios10
UIImageに影付き文字を挿入する方法について


原因はよく分かりませんが、コメントに記載の条件「全角文字が含まれている場合」に(このような条件については、コメントだけでなくご質問本文に含めるようにお願いします)影の部分が描画されなくなるという現象はこちらでも確認(Xcode
8.3.3のPlayground上)できました。

(ちなみにXcode 9 GM seedでは、あなたのコードをSwift 4での修正に合わせるだけで、日本語を含む文字列にも影がつきました。)

もちろん特定条件で一部の属性が無効になるという記述はドキュメントにはありませんので、単純にバグとして[Appleに報告](http://developer.apple.com/bug-
reporting/)した方が良いように思われます。

さて、 **_上記問題を解決するには、どのような方法があるでしょうか_**
と言うのがご質問のお題のようなので、(原因をあれこれ考えるのは早々にあきらめて)私の環境ではこれでうまくいったというコードを掲載しておきます。

[code]

    let font = UIFont.boldSystemFont(ofSize: 20)
    
    let imageWidth = image.size.width
    let imageHeight = image.size.height
    
    let rect = CGRect(x:0, y:0, width:imageWidth, height:imageHeight)
    
    UIGraphicsBeginImageContextWithOptions(image.size, false, 0)
    
    image.draw(in: rect)
    
    let textRect  = CGRect(x:0, y:0, width:imageWidth, height:imageHeight)
    let textStyle = NSMutableParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle
    
    let shadow = NSShadow()
    shadow.shadowColor = UIColor.red
    shadow.shadowOffset = CGSize(width: 5, height: 3)
    shadow.shadowBlurRadius = 3
    
    let textFontAttributes = [
        NSFontAttributeName: font,
        NSForegroundColorAttributeName: UIColor.black,
        NSParagraphStyleAttributeName: textStyle,
        NSShadowAttributeName:shadow
    ]
    
    let attrText = NSAttributedString(string: text, attributes: textFontAttributes)
    attrText.draw(in: textRect)
    
    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext()
    
[/code]

あなたのコードとの違いは、`String`の(あるいは`NSString`の)`draw(in:withAttributes:)`メソッドを呼ぶのではなく、`NSAttributedString`をまず作成し、その`draw(in:)`メソッドを呼んでいるという点です。

ビルド環境の問題なのか実行環境の問題なのかも調べられていないのですが、そちらの環境ではどのような結果になりますでしょうか。お試しください。


CC BY-SA 3.0
2017-09-13T12:29:30.620
37927
2017-09-13T12:29:30.620
13972
37906
answer