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

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

ただいまの
回答率

90.49%

  • Xcode

    4199questions

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

  • Objective-C

    1198questions

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

  • iPhone

    997questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 601

northpotato

score 29

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:

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2016/04/04 19:33

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

    キャンセル

回答 2

checkベストアンサー

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 17:28

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 17:30

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

    キャンセル

  • 2016/04/05 20:24

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Xcode

    4199questions

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

  • Objective-C

    1198questions

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

  • iPhone

    997questions

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