お?いけるくさい?

iPhoneアプリエンジニアのたまごです。いっちょまえエンジニア目指してちいさな発見や学んだことを覚え書きしていきます!Objective-C/iOS/開発

指定したUIColorとCGRectで、塗りつぶしのUIImageを生成する

四角いカスタムボタンを透明で色指定して作ったときに

押したときにわかるようにしたい!と思い、

でもたしかカスタムボタンって

選択状態のときUIImage設定せんといけんかったっけ...

と思ったのですが、

デザイナーさんにわざわざぺた塗りの画像を切り出してもらうのも悪いし

UIColorからUIImageって生成できんのけ?絶対できるやろー

と思い調べてみたところ、

なんだか色々な人が色々なやり方でやっていて

しかもなんだかどれも「これ!」ってのが無かったのですが

見つけました。※こっちは使わないほうがいいよ。下まで読むべし

//指定したUIColorCGRectの大きさを塗り潰したUIImageを返す

UIImage *(^createImageFromUIColor)(UIColor *) = ^(UIColor *color)

{

    CGRect rect = CGRectMake(0, 0, 1, 1);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef contextRef = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(contextRef, [color CGColor]);

    CGContextFillRect(contextRef, rect);

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

};

[使用例]

    //塗りつぶし

    UIImage* fill = createImageFromUIColor([UIColor colorWithRed:0 green:0 blue:0 alpha:0.2]);

    [linkBtn setBackgroundImage:fill forState:UIControlStateHighlighted];

 

なんだこのメソッドの書き方、初めてみた!わかんね!

とか思いつつ、呼び方(生成)自体は簡単だし理想の挙動だし

しばらく使ってたのですが、

別ファイルでも同じことをしようとまったく同じように仕込んでみたところ、

Mach-O-Linker-Error とかいうエラーが出てビルドできなくなった...

うわー、これ嫌な感じのエラーなやつやん(;´ x`)と思いながら

解決策をググっていると

どうやらなんかさっき追加したこのコードが重複していることが原因くさい...

消してみたらうまくいった。

でもね、どっちのファイルでも使いたいんだよおお!ってことで

仕方なく別の方法を探す。

きっと似たようなことをやっているメソッドは落ちているはずだ!

要はreturnでUIImageが返ってきてる感じで、

できれば一言で呼べちゃうメソッドがいいなーと思っていたら、

落ちてた!!

 

ということでこっち使ったほうがいい。↓(すいませんまわりくどくて)

やってることはまったく同じ!呼び方も簡単!

これで指定した色・サイズでUIImageが生成できます。

//指定したUIColorCGRectの大きさを塗り潰したUIImageを返す

- (UIImage *)imageWithColor:(UIColor *)color {

    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    

    CGContextSetFillColorWithColor(context, [color CGColor]);

    CGContextFillRect(context, rect);

    

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    

    return image;

}

[使用例]

    UIImage* temp = [self imageWithColor:[UIColorcolorWithRed:0green:0blue:0alpha:0.2]];

    [linkBtn setBackgroundImage:temp forState:UIControlStateHighlighted];