2016-04-27 3 views
2

Swiftを使用したXcodeのUIButtonに画像を挿入しようとしています。ボタンはキーボード拡張機能にあり、iOSが既に内蔵キーボードにあるような「グローブ」アイコンを挿入しようとしています。私は地球儀絵文字とユニコード(これは自動的に絵文字として取り上げられる)を使用していましたが、それは良く見えませんでした。UIButtonのUIImageでベクター化された画像

これで、どのファイルを使用していても、私の画像はすべてぼやけています。これまでのところ、22pt、200pt、600pt、svg、pdfの画像を使用しています。運がない。

これは以下のようにそれが見えるものです:これはアップル1は、すべてがシャープ、どのように見えるかです Blurry image

:ボタンのSharp image

私のコードはこれです:

//Set an image to fit inside a button 
    let btn = nextKeyboardButton 
    let image = UIImage(named: "globe")! 
    var scaledImage = image 
    var targetWidth : CGFloat = 0 
    var targetHeight : CGFloat = 0 
    let spacing : CGFloat = 10 

    if(btn.frame.width < btn.frame.height){ 
     targetWidth = round(btn.frame.width - (spacing * 2)) 
     targetHeight = targetWidth 
    } else { 
     targetHeight = round(btn.frame.height - (spacing * 2)) 
     targetWidth = targetHeight 
    } 

    UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight)) 
    image.drawInRect(CGRectMake(0, 0, targetWidth, targetHeight)) 
    scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    btn.setImage(scaledImage, forState: .Normal) 
    btn.setTitle("", forState: .Normal) 
    btn.tintColor = UIColor.blackColor() 

として、アイコンは1:1、私は同じ幅と高さを使用します。しかし、私は別のアイコン/画像についても同じ(作業中の)アプローチが必要になります。私のタブバーに25,50,75ptで使用している他のアイコン/画像は、きれいに見えます。また、iPhone 4sまたは6 Plusの場合、どのシミュレータを使用するかは関係ありません。

また、これには他に解決策がありますか?私はすべてのグローブである別のフォントを使用しようとしましたが、XCodeはエディタにそれをリストしません。私はまた、世界の絵文字をペイントしようとしましたが、ユニコード文字を使用しますが、それは絵文字としてピックアップされます....だから..助け? :)

+0

私はそれが些細なことは知っていますが、@ 2xと@ 3xを使って大きな画像の名前を終了しましたか?また、PNGで試しましたか?私は通常それを使用し、それは完璧に見えます。また、ポイントではなくピクセル単位でイメージを保存しようとしましたか? – Lawrence413

+0

2つの問題があります:1.アセットファイルのベクターイメージは、ビルド時にPNGファイルに変換されるので、スケーリング時に(PDFがネイティブにレンダリングされた場合とは対照的に)ぼやけていることが保証されます。2. UIGraphicsBeginImageContextは、デバイスのスケーリングを使用します。あなたは 'たいUIGraphicsBeginImageContextWithOptions(サイズは、NO、0)' –

+0

いや、私は任意のため、2倍を入れて、正しい3倍して覚えて、たくさんのことを試してみました。私はたとえどちらが使われたのかを知るために色を変えることを考えました。私はピクセルとポイントの両方を試しました。しかし、私はUIGraphicsBeginImageContextがここで問題になると疑っていました。私はそれに精通していません。私はそれを試してみましょう! :) – dkcas11

答えて

2

あなたの主な問題は、UIGraphicsBeginImageContextはデバイス固有のスケーリングを実行しないということです。 @ 2x画面では、各点は2x2ピクセルの正方形ではなく、1つのピクセルで表されます。それはピクセルなので、それは見えます。

UIGraphicsBeginImageContextWithOptions(size, NO, 0)に切り替えると、十分大きな値を指定すると、鮮明に表示されるはずです。

もう1つ注意すべき問題は、アプリケーションではなくビルド時にPDFアセットが複数の解像度のPNGファイルにレンダリングされるため、22x22イメージを20x20にレンダリングすると(たとえば)ぼかしが発生するこれは、ベクター画像がデバイス上にレンダリングされているとは思わないでしょう。

+0

それは完全に良い意味を作る!私はちょうどそれを試して、それは完全に動作します! しかし、1つのこと..どのフォーマットがベストを尽くすでしょうか? PNGファイルは25,50,75、またはPDFまたは22ptと言うことができますか?私は、AppleがアイコンのためにPDFファイルのために22ptを推奨するところのどこかを読んだ。 – dkcas11

+0

それは私のために働いた! – cyberlobe

0

同様の問題への解決策を探しているかもしれない、あるいはボタンの画像に置くために興味がある人に、私は@Brianニッケルから修正案/助けを借りて、これを行い、完全な機能を作った:)

この関数は、ボタン、イメージ名、色、およびイメージの周囲のインデントの間隔をとるだけです。

func setImageForButton(_button : UIButton, _color : UIColor, _imageName : String, _spacing : CGFloat) { 
    let btn = _button 

    let image = UIImage(named: _imageName)! 
    var scaledImage : UIImage 

    var targetWidth : CGFloat 
    var targetHeight : CGFloat 
    let spacing : CGFloat = _spacing 

    if(btn.frame.width < btn.frame.height){ 
     targetWidth = btn.frame.width - (spacing * 2) 
     let scale = targetWidth/image.size.width 
     targetHeight = round(image.size.height * scale) 
     targetWidth = round(targetWidth) 
    } else { 
     targetHeight = btn.frame.height - (spacing * 2) 
     let scale = targetHeight/image.size.height 
     targetWidth = round(image.size.width * scale) 
     targetHeight = round(targetHeight) 
    } 

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(targetWidth, targetHeight), false, 0) 
    image.drawInRect(CGRectMake(0, 0, targetWidth, targetHeight)) 
    scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    btn.setImage(scaledImage, forState: .Normal) 
    btn.setTitle("", forState: .Normal) 
    btn.tintColor = _color 
} 
関連する問題