前回紹介したサンプルソース
iPhoneCoreDataRecipes
の何がすごいかというと、
iPhone OS Table Viewプログラミングガイド
とか読んでもいまいちわからんかったxibファイルからのUITableViewCell読み込み方法がわかるって事と、UITableViewはヘッダー(セクションヘッダーのことじゃなく)を持てるって事がわかるんですな。
エリカちゃんもビックリ(英語版のセカンドエディッションでは紹介されてるのかもね)。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20100109/00/xcc/a9/cb/j/o0418038110369312159.jpg?caw=800)
もともとの目的は、UIImageの縮小方法の調査だったんだけど、思わぬ拾いものですわ。
まあ、それはいったん置いといてUIImageの縮小方法。
わりと簡単で
そんな感じなり。
で、画面外描画領域の矩形をボタン領域をはみ出さないで、なおかつ、元画像の縦横比を保つ大きさに計算して面外描画領域作成。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20100109/00/xcc/67/38/j/o0351050410369344899.jpg?caw=800)
描画領域全体に元画像を描画し、これをUIImageとして取り出す事でスケーリングが完了ってわけです。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20100109/00/xcc/81/c9/j/o0203022610369352403.jpg?caw=800)
NewFlowerViewControllerクラスのimagePickerControllerメソッドへの実装はこんな感じ。
ビルドして実行。
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20100109/00/xcc/e3/42/j/o0216037710369360029.jpg?caw=800)
おっしゃ、こんなもんでしょう。
文字なんぞ入れてみたりして。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20100109/00/xcc/bb/38/j/o0281022510369366294.jpg?caw=800)
描画領域だから、なんだって描ける。
調子のってきた。
もういっちょ、お勧めのサンプルソース
TheElements
から、写真の下に鏡を置いたようにする方法(カバーフローでやってるやつね)
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20100109/12/xcc/1b/0e/j/o0276022210369667726.jpg?caw=800)
グッドだ!
でも、この花は?の目的考えると、これはやりすぎですな。
この花は?では使わないけど、あとあと有効に使えそうだから便利関数として用意しちゃおう。
というわけで、長くなりそうなんで、次回「UIImageインスタンスから上下反転してグラデーションをかけたUIImageインスタンスを作成する方法」。
サンプルソースも次回!
待てねーよ、な人はAppleのサンプルTheElementsを調べましょう。reflectedImageRepresentationWithHeightで検索すると出てくるよ。
こっちはUIViewのlayerを描画したりしてて、あー、こうやって反転アニメーションの画像を用意するわけねってのがわかったりする。読む価値有りですよ。
ではでは。
iPhoneCoreDataRecipes
の何がすごいかというと、
iPhone OS Table Viewプログラミングガイド
とか読んでもいまいちわからんかったxibファイルからのUITableViewCell読み込み方法がわかるって事と、UITableViewはヘッダー(セクションヘッダーのことじゃなく)を持てるって事がわかるんですな。
エリカちゃんもビックリ(英語版のセカンドエディッションでは紹介されてるのかもね)。
![$テン・シー・シー-1](https://stat.ameba.jp/user_images/20100109/00/xcc/a9/cb/j/o0418038110369312159.jpg?caw=800)
もともとの目的は、UIImageの縮小方法の調査だったんだけど、思わぬ拾いものですわ。
まあ、それはいったん置いといてUIImageの縮小方法。
わりと簡単で
1、UIGraphicsBeginImageContextで画面外に描画領域を作る。
2、画面外描画領域で描画作業
3、終わった時点でUIGraphicsGetImageFromCurrentImageContextを呼んで、画面外描画領域をUIImageにする。
4、UIGraphicsEndImageContextで作った画面外描画領域を破棄。
2、画面外描画領域で描画作業
3、終わった時点でUIGraphicsGetImageFromCurrentImageContextを呼んで、画面外描画領域をUIImageにする。
4、UIGraphicsEndImageContextで作った画面外描画領域を破棄。
そんな感じなり。
で、画面外描画領域の矩形をボタン領域をはみ出さないで、なおかつ、元画像の縦横比を保つ大きさに計算して面外描画領域作成。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20100109/00/xcc/67/38/j/o0351050410369344899.jpg?caw=800)
描画領域全体に元画像を描画し、これをUIImageとして取り出す事でスケーリングが完了ってわけです。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20100109/00/xcc/81/c9/j/o0203022610369352403.jpg?caw=800)
NewFlowerViewControllerクラスのimagePickerControllerメソッドへの実装はこんな感じ。
// 自分が作りたい画像の大きさを決めて描画領域を作る。
CGRect bounds = [imageButton
contentRectForBounds:imageButton.bounds];
// ボタンの内容部高さ x 0.95を最大とする。
double wide = bounds.size.height * 0.95;
CGSize size = image.size;
CGFloat ratio = 0;
if (size.width > size.height) {
// 横長なので、横幅で比率計算。
ratio = wide / size.width;
} else {
// 縦長。
ratio = wide / size.height;
}
CGRect rect = CGRectMake(0.0, 0.0,
ratio * size.width, ratio * size.height);
// 計算した描画領域を指定して描画準備。
UIGraphicsBeginImageContext(rect.size);
// UIGraphicsGetImageFromCurrentImageContextが呼ばれるまで
// 描画はすべて新しい描画領域が対象となる。
[image drawInRect:rect]; // イメージ描画。
// 新しい描画領域からUIImageを作成。
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); // 解除。
// スケーリングされたUIImageを設定。
[imageButton setImage:image forState:UIControlStateNormal];
// 説明文は消す。
[imageButton setTitle:nil forState:UIControlStateNormal];
CGRect bounds = [imageButton
contentRectForBounds:imageButton.bounds];
// ボタンの内容部高さ x 0.95を最大とする。
double wide = bounds.size.height * 0.95;
CGSize size = image.size;
CGFloat ratio = 0;
if (size.width > size.height) {
// 横長なので、横幅で比率計算。
ratio = wide / size.width;
} else {
// 縦長。
ratio = wide / size.height;
}
CGRect rect = CGRectMake(0.0, 0.0,
ratio * size.width, ratio * size.height);
// 計算した描画領域を指定して描画準備。
UIGraphicsBeginImageContext(rect.size);
// UIGraphicsGetImageFromCurrentImageContextが呼ばれるまで
// 描画はすべて新しい描画領域が対象となる。
[image drawInRect:rect]; // イメージ描画。
// 新しい描画領域からUIImageを作成。
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); // 解除。
// スケーリングされたUIImageを設定。
[imageButton setImage:image forState:UIControlStateNormal];
// 説明文は消す。
[imageButton setTitle:nil forState:UIControlStateNormal];
ビルドして実行。
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20100109/00/xcc/e3/42/j/o0216037710369360029.jpg?caw=800)
おっしゃ、こんなもんでしょう。
[image drawInRect:rect]; // イメージ描画。
[[UIColor grayColor] set];
UIFont *font = [UIFont boldSystemFontOfSize:24];
CGPoint point = CGPointMake(2,1);
[@"Flower" drawAtPoint:point withFont:font];
// 新しい描画領域からUIImageを作成。
image = UIGraphicsGetImageFromCurrentImageContext();
[[UIColor grayColor] set];
UIFont *font = [UIFont boldSystemFontOfSize:24];
CGPoint point = CGPointMake(2,1);
[@"Flower" drawAtPoint:point withFont:font];
// 新しい描画領域からUIImageを作成。
image = UIGraphicsGetImageFromCurrentImageContext();
文字なんぞ入れてみたりして。
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20100109/00/xcc/bb/38/j/o0281022510369366294.jpg?caw=800)
描画領域だから、なんだって描ける。
調子のってきた。
もういっちょ、お勧めのサンプルソース
TheElements
から、写真の下に鏡を置いたようにする方法(カバーフローでやってるやつね)
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20100109/12/xcc/1b/0e/j/o0276022210369667726.jpg?caw=800)
グッドだ!
でも、この花は?の目的考えると、これはやりすぎですな。
この花は?では使わないけど、あとあと有効に使えそうだから便利関数として用意しちゃおう。
というわけで、長くなりそうなんで、次回「UIImageインスタンスから上下反転してグラデーションをかけたUIImageインスタンスを作成する方法」。
サンプルソースも次回!
待てねーよ、な人はAppleのサンプルTheElementsを調べましょう。reflectedImageRepresentationWithHeightで検索すると出てくるよ。
こっちはUIViewのlayerを描画したりしてて、あー、こうやって反転アニメーションの画像を用意するわけねってのがわかったりする。読む価値有りですよ。
ではでは。