iPhoneアプリ開発のカスタムUIViewでの値計算と描画方法について

このQ&Aのポイント
  • iPhoneアプリ開発初心者の質問です。XcodeのカスタムUIviewについて理解ができず苦しんでいます。利用者が値を入力し、計算結果に基づいて線を描画する方法を教えてください。
  • iPhoneアプリ開発初心者の質問です。XcodeのカスタムUIviewについて理解ができず苦しんでいます。利用者の入力に基づいて値を計算し、それに応じた線を描画する方法を教えてください。
  • iPhoneアプリ開発初心者の質問です。XcodeのカスタムUIviewについて理解ができず苦しんでいます。利用者が入力した値を計算し、計算結果に基づいて線を描画する方法を教えてください。
回答を見る
  • ベストアンサー

iphoneアプリ開発,カスタムUIViewの質問

iPhoneのアプリケーション開発についての質問です。 最近アプリ開発を始めた初心者です。 XcodeのカスタムUIviewについていまいち理解ができず苦しんでおります。 作りたいのは 利用者が値を入力(例:5)→簡単な計算(例:5×2=10) →計算された長さの線を描画(例:長さ10の線が描画される) というモノなんですが 【UIviewControllerクラスにて】 (1)利用者が入力(数字)→(2)計算→(3)出力(数字) 【カスタムUIviewクラスにて】 (4)線を描画 は何とかできるのですが、上記で i、(2)から(4)へ計算結果を渡し、(2)の長さの線を(4)で描画する ii、カスタムUIviewクラスで(1)~(3)を行う iii、controllerクラスで(4)のように線を描画する の、どれかをすることは可能でしょうか? また、根本的に違う方法(カスタムUIviewは用いない等)でも構いません、 上記のように入力した値を計算処理の後描画させる方法があれば教えていただけませんでしょうか。 詳しい方には初歩的すぎて恐縮なのですがどうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.3

> それではピンポイントに1つだけ質問させてください、 Viewに描画することは、UIViewサブクラスの「drawRect」メソッド以外では行えません。※注 (Mac OS X Cocoaフレームワークなら、メソッド「lockFocus」~「unlockFocus」を使って、それ以外の場所でも描画できるのですが、iOSのフレームワークでは使えません) なので、描画以外の処理も、UIViewサブクラス上でやっちゃうのが、かんたんという、No.1の回答につながるわけです。 ※CALayer(Core Animation Layer)のDelegateとして、「drawLayer:inContext:」というメソッドを使って、描画する方法が、ないわけではない。

その他の回答 (2)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> 簡単に説明していただけると幸いです。 かんたんな説明では、おそらくあなたは理解できないでしょう。ここであなたが書いた文章を読む限りで判断すれば、あなたはここで質問できるレベルまで、達していません。 なんらかの入門書をもとに勉強なさっているのでしょうから、もういちどその書籍を最初から読み直して、いちから勉強してください。 あなたが求めようとしているのは、入門講座をあなたひとりのために開いてくださいということであって、さすがにギャラなしでそれに応じることはできません。金にならないことに、時間を割くことはできませんからね。 ちゃんと質問をピンポイントに絞ってくれなければ、お相手することはできません。

abehiroshi
質問者

補足

勉強不足で申し訳ありません、、 それではピンポイントに1つだけ質問させてください、 線を描画する場合、新規に追加したUIView subclassのメソッドファイルにおいて - (id)initWithFrame:(CGRect)frame {if (self = [super initWithFrame:frame]) {}return self;} -(void)drawRect:(CGRect)rect{    CGContextRef context=UIGraphicsGetCurrentContext();    CGContextTranslateCTM(context, 0,rect.size.height);    CGContextScaleCTM(context, 1.0, -1.0);    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);    CGContextSetLineWidth(context, 1.0);    CGContextBeginPath(context);    CGContextMoveToPoint(context,0, 200.0);    CGContextAddLineToPoint(context, 0, 250.0);           ・・・・・ のようにしているのですが、この文はUIViewControllersubclassのメソッドファイルでは使えませんでした。そこで、これと同じような処理がUIViewControllersubclassでも行える文、またはUIViewControllersubclassからUIView subclassへ値を渡すための処理(~という文を使って値を公開、~という文で取得 だけで構いません)があればをおしえていただけないでしょうか

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

わかりにくければ、UIViewControllerをいっさい使わずに、UIView(のサブクラス)でぜんぶまかなってしまえば、わかりやすく、コードも簡潔になるでしょう。 UIViewControllerクラスは、「MVCアーキテクチュア」という概念にのっとって作られたもので、iOS SDKのベースになったMac OS X Cocoaの初期バージョンにはなかったものです。MVCアーキテクチュアを利用すると、データ処理に関するコードを大幅に短縮でき、ほとんどInterface Builderで構築できてしまいます。そのために必要になるのが、名前に「Controller」と付くクラスです。 大規模なデータ処理であれば、MVCアーキテクチュアは威力を発揮しますが、かんたんなデータ処理なら、役不足になります。たとえていうなら、自宅の増改築をするために、スカイツリーで活躍しているクレーンと同規模のものを、レンタルするようなものです。 MVCアーキテクチュアの考え方は、データの読み込み、データの計算、データの書き出しといったデータ処理プログラム(Model)と、計算の結果をViewに描き出すプログラム(View)を切り離すことにより、コードを単純にすることにあります。これらふたつを橋渡しするものとして、コントローラ(Controller)が必要になるのです。 この概念に従うなら、それにいちばん近いのは…… > 【UIviewControllerクラスにて】 > (1)利用者が入力(数字)→(2)計算→(3)出力(数字) > 【カスタムUIviewクラスにて】 > (4)線を描画 です。その手法でプログラムが完成しているのなら、それを採用するのが、iOS SDK全体といちばんなじみ、齟齬をきたさないでしょおう。

abehiroshi
質問者

補足

> UIViewControllerをいっさい使わずに、UIView(のサブクラス)でぜんぶまかなってしまえば、わかりやすく、コードも簡潔になるでしょう。 ということは,目標とする 「利用者が値を入力(例:5)→簡単な計算(例:5×2=10→計算された長さの線を描画(例:長さ10の線が描画される)」 という流れのプログラムは ii、カスタムUIviewクラス(線を描画するクラス)で(1)~(3)を行う の考え方でつくることが可能ということでしょうか? 現状況の > 【UIviewControllerクラスにて】 > (1)利用者が入力(数字)→(2)計算→(3)出力(数字) > 【カスタムUIviewクラスにて】 > (4)線を描画 では「(2)の計算結果を(4)で描画」ということができていないためプログラムが完成していません。 それと初歩的な質問で申し訳ないのですが、今後、UIViewControllerを使わないUIView(のサブクラス)で作る。ということはX-CODEの新規の追加ファイルでいうところの「UIviewController subclass」ではなく「objective-C class」で作っていく。ということでよろしいのでしょうか? この場合、「objective-C class」にはxibファイルが含まれていないため利用者が数値を入力できるようにするためにどのようにプログラムを組めばよいかがわかりません。簡単に説明していただけると幸いです。 質問が増えてしまって申し訳ないです。

関連するQ&A

  • iPhoneのアプリ開発、Xcodeについてお伺い致します。

    iPhoneのアプリ開発、Xcodeについてお伺い致します。 Xcodeのユーティリティアプリケーションのテンプレートを使って、裏面(Flipside View)にTable Viewを配置するアプリを開発本にそって造っています。 Table ViewをViewに貼り付けて使用するには、DataSourceやDelegateを実装しなくても、UITableViewControllerクラスを利用すればTable Viewは使用可能、と開発本に記載してありました。その本に沿って、XcodeにてUITableViewと接続する UITableViewControllerのサブクラスを作成しようとしたところ、「Subclass of」と書かれたラベルの横にあるプルダウンメニューの中に、開発本にある様な「UITableViewController」がありません。 (写真が実際の画面の写真で、開発本にはこのプルダウンメニューにUITableViewControllerがあるのですが…。) どのようにすれば、UITableViewControllerのサブクラスを作成できるかご教示いただければ幸いです

  • 【iOSプログラミング】UIViewを統合させたい

    iPhoneアプリを作ろうとしていて とりあえずペイントソフトを作っています。 アルゴリズムは、タッチの軌跡の点を多数取得し、一つ一つを直線で繋げることで、軌跡通りの複雑な曲線を描画しています。 また、Undo(戻る)機能付加の為に線一つ一つに対してUIViewをインスタンス化しているのですが たくさん線を描くうちに、UIViewの数が多くなりすぎて動作が重くなってしまいます。 その為、UIViewを古いものから順にスーパークラス(或いは、一番古いサブクラス)へと統合してしまいたいのですが その為のメソッドが見当たりません。 どうかご教授お願いします。 また、当方初心者ですので、複雑な処理に関しては説明もお願いしたいです>< ついでに曲線描画についてのアルゴリズム指摘もお願いしたいです

  • UIImageViewをタップで、画面遷移するには

    iphoneのアプリ開発のなかでわからない部分があるので、投稿しました。 UIViewControllerクラスのサブクラス(Nomal_topViewController)の上に、UIViewクラスのサブクラス(PreviewView)の上に、UIImageViewのサブクラス(TapImage) というレイヤー順で表示しているのですが、TapImageをタップした際、新しいViewControllerを開く、もしくは全画面表示のViewを開く。という処理を行いたいのですが、どのような処理を実装すればよいのでしょうか? TapImageでタップは検出できています。 わかる方いましたら、ご返答よろしくお願いします。

  • objective-c 画像変更の処理について

    質問の内容が分かりにくかったらすいません… 現在xcodeでアプリを作成しています。UIViewControllerをスーパークラスに持つ”クラスA”に、UIImageViewで画像を画面全体に貼付けています。 UIViewControllerをスーパークラスにもつ”クラスB”を作成し、”クラスA”と画面遷移で行き来ができるようにしています。 質問なのですが、"クラスB"にUIButtanを配置し、ボタンを押すと”クラスA”の画像が変更できるようにしたいのですが、どのような方法をとればいいでしょうか? 用は”クラスB”を設定画面にして、”クラスA”の画像などを変更したいです。 アクセサメソッドで値を取得したり、CoreDataを使ったりしたのですがうまくいきません… ネットで調べたり、本を読んでも解決しませんでした。 是非ともご教授お願いいたします。

  • iPhone開発ViewControllerのメモリ開放について

    iPhone開発ViewControllerのメモリ開放について iPhone開発ViewControllerの動きについて質問させて下さい。 XIBで指定したコントロールに対して、hファイルでアウトレットを宣言した変数はviewDidUnloadでリリースすべきか、deallocでリリースべきかを教えて頂けないでしょうか。 ただ、これには前提の条件が必要と思いますので、条件を記述いたします。 以下の条件下でどちらが良いのか教えて頂けないでしょうか。理由も合わせてお願いします。 viewDidUnloadに記述すべきと記述している資料が多いような気がしますが、deallocに記述している資料も多いのです。 deallocはおまじないで記述しているだけなのでしょうか? 前提条件 1、Xcodeバージョン3.2.3 2.XCODEの新規のファイルのテンプレートの選択でUIViewController subclassで   Viewとビューコントローラを作成します。 3.アウトレットの宣言   @interface TestView : UIViewController {    UIButton *btn1;   }   @property(nonatomic, retain) IBOutlet UIButton *btn1;   @end      @implementation TestView   @synthesize btn1;   ・・・・   処理   ・・・・   @end 4.TestViewはモーダル表示で、任意の画面から表示します。   TestView *tv = [[TestView alloc] init];   tv.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;   [self presentModalViewController:tv animated:YES];   [tv release]; 5.TestView画面の終了はTestView上のボタン押下で画面が閉じます。   [self.parentViewController dismissModalViewControllerAnimated:YES]; 6.処理中にはメモリ不足によるdidRecieveMemoriWarningは発生しない前提です。 上記の場合、NSLogでイベントの発生を見ると以下のようになります。 2010-08-16 23:42:44.454 MemoryTest[1606:207] TestView - viewDidLoad 2010-08-16 23:42:44.458 MemoryTest[1606:207] TestView - viewWillAppear 2010-08-16 23:42:46.117 MemoryTest[1606:207] TestView - viewWillDisappear 2010-08-16 23:42:46.839 MemoryTest[1606:207] TestView - dealloc didRecieveMemoriWarningが発生しないので、ViewDidUnLoadも発生しません。 ここまでは理解できますが、ViewDidUnLoadのみに[btn1 Release];を記述した場合、btn1は開放されるのでしょうか。 ビューコントローラのdeallocは発生しているので、OKということでしょうか? dealloc内の[super dealloc];XIBに関連するものは全て開放してくれるのでしょうか?それなら記述しなくて良い? それともViewDidUnLoadとbtn1の両方に記述すべきなのでしょうか? ビューコントローラのdeallocが発生しているということは、btn1も開放されているということですか? ビューコントローラのdeallocが発生しているけど、btn1も開放されないこともあるのでしょうか? すみません。次から次への疑問がわきます。多分、この辺の仕組みを理解していないのだと思いますが、いろいろ調べたのですが、納得する答えが見つかりませんでした。 どうかよろしくお願いします。

  • VisualStudioによるアプリ開発について

    お世話になります。 アプリケーション(オーダーシステム)を開発する上で、下記の環境で実現可能か否かご教授下さい。 <環境>  ・A株式会社よりB株式会社へ商品をオーダーします。AとB間はVPN接続です。  ・Bにはオーダーを蓄積する為のSQLサーバーがあります。  ・Aはアプリケーションを起動し、必要項目を入力の上、オーダーします。そのオーダーした内容はBのSQLサーバーに蓄積されます。  ・Aより複数人から同時にオーダーされる場合もあります(同時にDBへアクセスされる為、排他制御が必要?)。 今回はAで利用する為のアプリケーションを開発したいと考えております。今までAccessで同じようなものを作ったことありますが、今回はAに複数人いる為、それぞれのPCにAccessをインストールする訳がいかない為(OfficeProやAccessを人数分買えない為)、Visual Studioで開発出来たらと考えた次第です。 Accessと同様にフォームをいくつか作成し、入力された内容をDBへ登録するだけなのですが、これは可能なのでしょうか。 何分Visual Studio自体触ったことが無い為、どのようなものかいまいちイメージが付きません。 Visual Studioでのフォームの作成等はこれから勉強するとして、そもそも上記が可能か教えて頂けたらと思います。 また、開発する上での注意点等ございましたらお教え頂けたらありがたいです。 以上、宜しくお願い致します。

  • アンドロイド開発での外部jarファイルの呼び出し

    趣味でアンドロイドアプリの開発を行なっているのですが、外部jarファイルを読み込み、そのファイル中で計算した値を利用したいと考えてプログラムを書いています。 jarファイルのimportを行い、アンドロイドのコード中でjarファイルのクラスを呼び出すことが出来たのですが、そのクラス中の値をアンドロイドのコード中から呼び出すと、本来Stringの文字列が格納されているはずが、nullが入っていると表示されてしまいます。  そこで質問なのですが、アンドロイドのコード中から外部jarファイル中の値を参照するにはどうしたらよいのでしょうか? そもそもアンドロイドのプロジェクトから外部のjarファイルを呼び出すことは不可能なのでしょうか? 何か解決方法があれば、回答お願い致します。

  • iPhone IBを使用しないでUITabBarControllerを

    iPhone IBを使用しないでUITabBarControllerを実装 - (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // UIViewControllerを継承したクラス page1Controller = [[Page1Controller alloc] initWithNibName:nil bundle:nil]; page2Controller = [[Page2Controller alloc] initWithNibName:nil bundle:nil]; // 質問1 tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil]; [tabBarController setViewControllers:[NSArray arrayWithObjects:page1Controller, page2Controller, nil] animated:NO];  // 質問2 [window addSubview:tabBarController.view]; tabBarController.selectedIndex = 1; } 上記プログラムなのですが、 質問1.UITabBarControllerのsetViewControllersメソッドを利用して、     UIViewControllerのインスタンスをセットしているのですが、     setViewControllersメソッドは、     UITabBarControllerのプロパティviewControllersに     値をセットするためのセッターなのでしょうか? 質問2.[window addSubview:tabBarController.view]のviewは、     UITabBarControllerが継承しているUIViewControllerの     view(ゲッター)なのでしょうか? 上記の流れで、UITabBarControllerが、UIVeiwControllerを集約?しているので、 (@property(nonatomic, copy) NSArray *viewControllersとUITabBarControllerのヘルプに明記しているので) WindowのaddSubViewにセットするのは、UITabBarControllerのUIViewControllerのviewじゃないのかな? と初心者ながらの疑問です。 継承などの理解不足があると思いますが、ご教授の程お願いいたします

  • エクセルの図形描画で?

    Excel2003を使用しています。 セルに文字や数字を入力し、「図形描画」で○や□の線で囲むと文字や数字が隠れてしまいます。 図形描画で書いたオブジェクト(○や□)を背面へ移動するという操作をしても文字や数字が現れて来ません、操作方法を教えて下さい。

  • iPhoneのアプリケーションのローカライズについて

    iPhoneのアプリケーションのローカライズについて iPhoneのアプリケーション開発の勉強をしています。 開発環境はXcode 3.2.4で、シュミレータ4.1で動作確認を行っています。 ローカライズに対応しようと以下のサイトを参考にしてみました。 http://akisute.com/2008/12/iphone_21.html Localizable.strings ファイルを追加し、NSLocalizedStringメソッドで値を取得するまではできました。 例) "hoge" = "hoge"; NSString* string = NSLocalizedString(@"hoge", nil); →string に "hoge" が格納される。 ところが、ファイルの設定で「ファイルをローカライズ可能にする」を選択して「English」が追加された後、 ローカライズの値を変更しても反映されません。 例)  "hoge" = "hoge hoge"; NSString* string = NSLocalizedString(@"hoge", nil); →string に "hoge" が格納される。 ※"hoge hoge"にならない。 XCode で クリーニングを行ったり、build フォルダを削除しましたが状況は変わりません。 Finder でパッケージの中を確認しましたが、Localizable.stringsは English.lproj にのみ存在し、 内容も編集後の状態になっているようです。 ※そもそも"hoge" のリソースがない状態になっているのに、何故情報が残っているのか不明です。 原因がわからず途方に暮れている状態です。 皆様のお知恵を拝借できればと思いますので、何卒よろしくお願いいたします。

専門家に質問してみよう