質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

1195閲覧

image view に表示した図形が消えていく

northpotato

総合スコア38

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2016/04/04 07:28

編集2016/04/04 18:47

xcode7, objective-c, iPod touch の初心者です。

イメージ説明
これは、背骨が横に曲がる病気(側弯症)を早期に発見するデバイスの完成予想図です。
児童を立位前屈した状態で、ipodtouch を乗っけたローラーを腰から頸部に向けて転がして行ったとき、その角度によって表示色を変えようとしています。即ち、傾斜角が0から4度であれば青バー(安全域)、5〜9度であれば黄色バー(注意域)、10度以上であれば赤バー(危険域)、となり、黄色バーが表示された時点で、画面下に「専門医受診を促すメッセージ」を表示させます。ここでの傾斜角5度が、側弯角20度に相当していると言われています。
そこで、実際の測定においては、前屈させた児童の腰から首にむけて ipodtouch をつけたローラーを転がして行くのですが(10秒を目処に)、その開始時間からの秒数が swtch 文の引数にしてあります。ですから、傾斜バーは、下の腰の方から表れていくようにしてあります。横の数値は、傾斜角です。
だいたいのイメージをつかんで頂けたでしょうか。
ここで、
storyboard上に貼った、image view 上に、スイッチ文に対応した位置に angle の
値に応じて、青、黄色、赤の水平バーを引き、黒の枠線を付けています。
ただ、スイッチ文が例えば、1から2に移動すると、1で表示したバーが消えてしまい、3に行くと2で描いたバーが消えてしまいます。
これを、消えないようにするには、どうしたらよいのでしょうか。

どなたか、ご教示頂けましたら、幸いです。
宜しくお願い致します。

UIGraphicsBeginImageContext(_Image_View.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 switch (time_dif) { case 1: if (angle == 0 ) {self.y10.transform = CGAffineTransformMakeScale(0, 1); self.x10.transform = CGAffineTransformMakeScale(0, 1); self.R10.text =[NSString stringWithFormat:@"%.0f",angle * 0]; self.L10.text =[NSString stringWithFormat:@"%.0f",angle * 0]; angle_disp[time_dif-1] = angle; } // 角度:正 被検者の左サイド 右バー else if (angle > 0 ){ if (fabsf(angle) < bndry_1 ) { CGContextSetRGBStrokeColor(context, 0, 0, 1, 1.0);}// 青 else if (fabsf(angle) >= bndry_1 && fabsf(angle) < bndry_2){ CGContextSetRGBStrokeColor(context, 1, 1, 0, 1.0);} // 黄色 else if (fabsf(angle) >= bndry_2 ) { CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);} // 赤 CGContextMoveToPoint(context, y10_x, y10_y+5); // 始点 CGContextAddLineToPoint(context, y10_x+100*angle_ratio, y10_y+5); // 終点 CGContextSetLineWidth(context,10); // 線幅 CGContextStrokePath(context); // 線描画 CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);// 枠色: 黒 CGContextSetLineWidth(context,1); // 線幅 CGRect r1 =CGRectMake(y10_x, y10_y, 100*angle_ratio, 10); CGContextAddRect(context, r1); CGContextStrokePath(context); // 四角描画 _Image_View.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); angle_disp[time_dif-1] = angle; self.L10.text =[NSString stringWithFormat:@"%d",angle_disp[time_dif-1]];} // 角度:負 被検者の右サイド 左バー else if (angle < 0){ if (fabsf(angle) < bndry_1 ) { CGContextSetRGBStrokeColor(context, 0, 0, 1, 1.0);} // 青 else if (fabsf(angle) >= bndry_1 && fabsf(angle) < bndry_2){ CGContextSetRGBStrokeColor(context, 1, 1, 0, 1.0);} // 黄色 else if (fabsf(angle) >= bndry_2 ) { CGContextSetRGBStrokeColor(context, 1, 0, 0, 1.0);} // 赤 CGContextMoveToPoint(context, x10_x+ 100, x10_y+5); // 始点 CGContextAddLineToPoint(context, (x10_x+100) - (100*angle_ratio), x10_y+5); // 終点 CGContextSetLineWidth(context,10); // 線幅 CGContextStrokePath(context); // 線描画 CGContextSetRGBStrokeColor(context, 0, 0, 0, 1.0);// 枠色: 黒 CGContextSetLineWidth(context,1); // 線幅 CGRect r1 =CGRectMake(x10_x+ (100-fabsf(100*angle_ratio)), x10_y, fabsf(100*angle_ratio), 10); CGContextAddRect(context, r1); CGContextStrokePath(context); // 四角描画 _Image_View.image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); angle_disp[time_dif-1] = ceilf(angle); self.R10.text =[NSString stringWithFormat:@"%d",angle_disp[time_dif-1]];} break; case 2: case 3: ..........

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Stripe

2016/04/04 10:33

switch文を使うことに、何かこだわりがあるんですか?
guest

回答2

0

ベストアンサー

質問のコードをどこでどう呼び出しているのか肝心なところの説明がないので、最初は何をしているのかわかりませんでしたが、アプリの仕様から推測すると、おそらく1秒に1回ずつtime_difの値を増やしながら質問に書かれたコードを何度も呼び出し、_Image_View.imageを更新しているのだろうと思いました。
もしそうでしたら、毎回対象時刻のバーだけ描画した新しいイメージを作成し直して、その新しいイメージに入れ替えているのですから前の時刻のバーが消えるのは当たり前です。

大まかには以下のようにすればよいと思います。
(1)測定開始時(startボタンタップ時)に
UIGraphicsBeginImageContext(_Image_View.frame.size);
を実行する

(2)測定中の毎時刻にCGContext系の関数で指定時刻のバーを描画し、
_Image_View.image = UIGraphicsGetImageFromCurrentImageContext();
で、現在描画中のコンテキストをイメージにする。
(ここでUIGraphicsEndImageContext()を実行してcontextを解放しない)

(3)測定終了時(stopボタンタップ時)に
UIGraphicsEndImageContext();
を実行してcontextを解放する。

投稿2016/04/05 02:36

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

northpotato

2016/04/05 08:28

いつも、ありがとうございます。ご指示頂いたように修正しましたところ、希望の描画ができました。 また、宜しくお願い致します。
guest

0

図形は消えるのではなく、描いていないだけです。
ここでswitch文を使う意味はありません。
図形を描こうとした時点で、蓄積されている全ての計測値を描画してください。

投稿2016/04/04 23:08

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

northpotato

2016/04/05 08:30

回答、ありがとうございます。 次回、switch 文を使わない方法を考えたたいと思います。
Stripe

2016/04/05 11:24

ちなみに、UIGraphicsBeginImageContext()を呼んで、グラフィックを描いたあと、UIGraphicsEndImageContext()を呼ばずに置いておくのは、基本的にNGです。 少なくとも、関数からreturnしてRunLoopに戻るまでに、UIGraphicsEndImageContext()を読んでおいてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問