- ベストアンサー
objective-cで困っている初心者の質問
- objective-cをトライ&エラーで学習している初心者が、タッチした場所に正方形を表示し、スライダーで正方形の大きさを変えて画像のトリミングをしたいができない。どうすれば良いか教えてください。
- Objective-Cの初学者です。タッチした場所に正方形を表示させ、スライダーを使って正方形の大きさを変えて画像のトリミングを試みています。しかし、正方形が表示されず、タッチした位置と切り取られる位置がずれてしまいます。解決方法を教えてください。
- Objective-Cを学習中の初心者です。タッチした場所に正方形を表示する機能を作りたいのですが、正方形が表示されずに困っています。また、スライダーで正方形の大きさを変えて画像のトリミングを行いたいです。どのようにすれば良いでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、正方形が表示されない理由は --------------------------------------------- //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 --------------------------------------------- の記述箇所がまずいからだと思います。 これはどこに書いてもいいものではありません。 http://ameblo.jp/yusuke-s9th-tech/entry-11179466733.html に例があるように、drawRectメソッドの中に書く必要があります。 drawRectメソッドの中なら、画面描画用のコンテキストが確保 された状態で呼ばれるのでUIGraphicsGetCurrentContextを 実行するとコンテキストが返ってきます。現在記述している箇所だと、 おそらくコンテキストはNULLが返ってきているのではないかと思います。 あと、描画色も指定する必要があると思います。 そのあたりは、先ほど紹介したURLを参考にしてください。 なお、四角形を書くだけなら、透明のUIViewを作って http://hachinobu.hateblo.jp/entry/2014/01/20/165713 のように境界線を描画するよう指定する方法もあります。 最終的に複雑な図形にしたいならやはりコンテキストに描画する 必要があります。 次に、タッチした位置と切り取られる位置がずれている理由は、 タッチした位置を取得するのに CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 で、self.viewの座標を求めているのに対して、 切り取りは CGRect trimArea = CGRectMake(x, y, v, v); CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); と、画像イメージに対してそのままself.viewの座標を指定しています。 しかし、画像イメージは CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; とself.viewの20ピクセル下から表示しているため、ずれているのだと思います。 あと、読み込んだ画像のサイズがもし360x360でなかったら、 imageView.contentMode = UIViewContentModeScaleAspectFit; により、360x360に合うように自動的に画像が縮小表示される可能性もありますので、 そのあたりの調整も必要かもしれません。 いずれにしても、適切な座標変換をする必要があるということです。 座標変換は、 http://qiita.com/edo_m18/items/06e55b60f4d7adb9e0ea で解説されているconvert***系メソッドが使えます。
その他の回答 (1)
- Lchan0211b
- ベストアンサー率61% (573/930)
No.1です。 一つ見落としていました。 正方形が表示されない件ですが、もしdrawRectメソッドの中で 正しく描画できたとしてもまだ問題があります。 UIViewに正方形を描画しても、その上にimageViewが乗りますから、 結局imageViewの裏に隠れて見えないことになります。 結局、背景色透明のUIViewをimageViewより上に乗せ、 そのUIViewのdrawRectを実装するか、 あるいはそのUIViewの境界線で四角形を表示する必要があると思います。
お礼
丁寧な対応ありがとうございます。四角形は透明のUIViewの方法で思っているようにできました。タッチの座標がずれるのは教えていただいたconvertメソッドでy方向の20ずれはなくなりました。convertメソッドだけで、拡大縮小された画像から狙ったところが切り抜けるのでしょうか? Convertメソッド勉強していきたいです。また、よろしくお願いします。