• ベストアンサー

iPhoneアプリの開発についてです。

navigationControllerの画面遷移に関する質問です。 画面遷移するビューコントローラにUIToolBarを置いているんですが、遷移する際次に表示するビューにあるツールバーが元のビューにあるツールバーの上に重なるようにアニメーションします。 ページをめくるアニメーションをしたまま、ツールバーだけ固定するようにはできないのでしょうか? ツールバー以外のビューだけをaddSubviewする方法も試し、それっぽいものができたのですが動作が不安定なところが所々見当たるので、ぜひコントローラの画面遷移で実装できたらと思います。

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

  • ベストアンサー
回答No.1

> 画面遷移するビューコントローラにUIToolBarを置いているんですが、遷移する際次に表示するビューにあるツールバーが元のビューにあるツールバーの上に重なるようにアニメーションします。 ビューコントローラにUIToolBarを置くのではなくて、 ナビゲーションコントローラにUIToolBarを置けば、 画面遷移時も固定されたままのツールバーができます。 今回の件で参考になるサイトを紹介しようとしたのですが、 いいのが見つからないので簡単に手順を書きます。 1. NavigationControllerのAttributes Inspectorで Simulated Metrics - Bottom Barの項目を 「Translucent Toolbar」に変更します。 そうすると、Navigation Controllerに自動的にToolbar部品が付加され、 NavigationController配下の各ViewControllerの最下行にツールバー 領域が確保されます。 2. (NavigationControllerでなく)各ViewControllerのツールバー領域に BarButtonItemをドラッグして配置します。 ViewControllerの画面毎にボタン配置を定義します。 これによりツールバー自体はNavigationController配下なので スクロールしませんが、ボタンの配置は画面毎に変えることができます。 3. 配置したボタンに対応するメソッドを定義し、ボタンの処理を書きます。 基本的にこれだけです。 StoryBoardを使わない場合は、単純にViewControllerの toolbarItemsプロパティにUIBarButtonItemの配列を設定するだけです。 (これがstoryboardを使う場合の2.の操作に相当します) こちらは参考になるサンプルがありました。 (参考) http://ios-dev.info/no-ib-how-to-use-toolbar/ あとはsetToolbarHiddenとかhidesBottomBarWhenPushedとかで 表示/非表示制御できます。

nylonraw999
質問者

お礼

思ったよりずっと簡単に解決しました。 ありがとうございます。

関連するQ&A

  • iPhoneアプリの開発についてです。

    UITableViewControllerをaddsubviewに関する質問です。 addsubviewするコントローラーをAddTableViewControllerとすると、 AddTableViewController *addView = [self.storyboard instantiateViewControllerWithIdentifier:@"AddView"]; [self.navigationController.view addsubView:addView.view]; といった感じです。 セルのラベルに文字列もでるんですがテーブルビューを動かす途端セルが消えてしまいます。 また、addView上でアラートを表示しようとするとエラーになるのはなぜなんでしょうか? ご指摘お願いします。

  • iPhoneアプリの開発についてです。

    NavigationControllerでstoryboardで生成したコントローラにUITableViewControllerをコードで生成し画面遷移しているのですが、コード生成したコントローラは画面遷移した際にviewWillAppearやviewWillDisappearなどが呼び出されません。 コードで生成したコントローラのviewWillAppearやviewWillDisappearはどうやって検知すればいいでしょうか?

  • iPhoneアプリ開発で画面遷移について

    現在iPhoneアプリを開発しています。 まだ技術レベルは低く簡単なものしか作れませんが、1つ疑問があり質問させてもらいました。 以下のような画面遷移がある場合、2から3に切り替える場合どのようなview切り替えの処理をすればいいのかわからなくて困っています。 例:ゲーム 1.ゲームタイトル(スタート) → 2.ゲームプレイ → 3.設定画面(効果音など変更) → 4.ゲームプレイ ・addsubviewでviewを追加しremoveFromSuperviewで戻す ・2,3のviewを読み込ませてbringSubViewToFrontなど使用して切り替える ただaddsubviewで追加しremoveFromSuperviewした場合、ゲーム画面は残っているので、設定画面で変更した項目など反映されなくて困っています。 切り替えのアニメーションよってもやり方は変わってくると思いますが、一般的に設定画面から戻ったあとすぐに反映させる場合はどのようなやり方があるんでしょうか? アニメーションなど切り替え方はなくても大丈夫です。 どなたか教えて頂けると助かります。 ご教授お願い致します。

  • iPhoneアプリの開発についてです。

    UINavigationControllerのルートに紐づけられたBookMarkViewControllerというビューがあります。 このBookMarkViewControllerはテーブルビューで、 (1) BookMarkViewController *nextDir = [[BookMarkViewController alloc] init]; [self.navigationController pushViewController:nextDir animated:YES]; 上記のようなコードで、次々と画面遷移していきます。 また、BookMarkViewControllerには、 (2) BookMarkViewController *move = [[BookMarkViewController alloc] init]; move.isMove = YES; UINavigationController *nav = [self.storyboard instantiateViewControllerWithIdentifier:@"BookMarkView"]; [nav setViewControllers:[NSArray arrayWithObjects:move, nil]]; [self presentViewController:nav animated:YES completion:nil]; 上記のような内容のメソッドがあり、次々と画面遷移することのできる新たなUINavigationControllerをモーダル表現で表示します。 画面遷移する前のBookMarkViewControllerでは、上記のコードでうまくモーダルがでるのですが、(1)のメソッドを実行し新たに作り遷移したBookMarkViewControllerではなぜか、 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present a nil modal view controller on target <BookMarkViewController: 0x11822e070>.' というエラーが吐き出されうまくいきません。 (2)のメソッドで「nav」を生成した直後にnav.viewControllersをNSLogしてみたのですが、nullがかえされてしまいました。(成功した例では<BookMarkViewController ○○○>と、正常に表示されました) 誰かわかる方ご指摘お願いします。

  • iPhoneアプリの開発についてです。

    元のビューからモーダルで表示させるビューに画面遷移に伴い値を受け渡したいのですがうまくいきません。 私は主に画面遷移する際 ○○○ *△△△ = [self.storyboard instantiateViewControllerWithIdentifier:@"□□□"]; [self presentViewController:△△△ animated:YES completion: nil]; とコーディングしています。 インスタンス生成部分を ○○○ *△△△ = [[○○○ alloc] init]; とすれば簡単に値が受け渡しできるのですが、storyboadで作ったような表示になりません。(セルの高さが違う、ラベルが表示されないなど) グローバル変数などを使っても解決できますが、なるべく複雑にはしたくありません。 ご指摘お願いします。

  • Xcodeの開発でエラーの解決したいです

    Xcodeでの開発で、エラーの解決できなくて困りました。 最初のViewからCoreDataを使ったTableViewへ遷移する際に落ちます。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; splitViewController.delegate = (id)navigationController.topViewController; UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0]; MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } else { UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } return YES; 上記のコードで落ちてるのですが、どうすればいいか分からないので困りました。 勉強不足で、すみません。 どのように対処すればよいか、ご教授お願いします。 ビルドして最初の画面でボタンを押して、テーブル・ビューへの遷移時に落ちて以下のエラーが表示されます。 [UINavigationController setManagedObjectContext:]: unrecognized selector sent to instance どうしても解決したいので、よろしくお願いします。

  • iPhoneアプリの開発についてです。

    iPhoneアプリにディレクトリ階層を管理し、テーブルビューに表示する機能を実装中です。 パスの後ろに、"/○○○(ディレクトリ名)"という文字列を足して指定のディレクトリのパスを取得し中のファイルやフォルダの一覧を取得するという手法を用いています。 次のディレクトリに進む分には問題ないのですが、元のフォルダに戻るときに問題が生じてしまいます。 セルをタップすることで元のパスの後ろに選択したフォルダの名前を足していますが、ナビゲーションコントローラーで戻る際にパスの後ろに足されたフォルダ名を取り除かなくてはなりません。 もちろん戻るボタンが押されたことを検知するコードを調べたのですが、 -(void) viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) { //ここでパスから文字列を取り除く } [super viewWillDisappear:animated]; } これではルートフォルダ→次のフォルダの間でしか検知されません。僕がやりたいのはルートフォルダ→次のフォルダ→次のフォルダ→・・・とすべてのフォルダ間の戻るボタンの検知をしたいのです。 didSelectRowAtIndexPathメソッドに UITableViewController *nextDir = [[UITableViewController alloc] init]; nextDir.tableView.delegate = self; nextDir.tableVIew.dataSourse = self; と記述することで、ストーリーボードにいくつもコントローラーを置かずにテーブルビューにディレクトリの内容を表示しています。 自前のコントローラー→nextDir間の戻るボタン検知は先ほど乗せたコードで検知できましたが、nextDir→nextDir間の戻るボタン検知はどうすればいいでしょうか? 簡単ですが説明図を作ってみました。わかりにくかったらすみません。

  • 【iphoneアプリ開発】ボタン&処理の共通化

    突然の質問失礼致しますm(_ _)m ナビゲーションバーを使用したアプリを作っています。 右に「使い方」の画面へ遷移するUIBarButtonItemを配置したいと考えております。 このとき、各画面のボタンの配置、遷移したときのアクションを書けば 遷移できるのは確認できたのですが、全てのページにそれを書くのがあまり よくないような気がしています。 ボタンとボタンのアクションを共通化することは可能でしょうか? また、その場合どのファイルにどのように書くのが後々の変更等にも耐えやすいでしょうか? (例えば、「使い方」ボタンを「設定」ボタンに変更する等。。。) 実装しているボタンとボタンのアクションのソースは以下になります。 //ボタンの配置(viewDidLoad) UIBarButtonItem *btn = [[UIBarButtonItem alloc] initWithTitle:@"使い方" style:UIBarButtonItemStylePlain target:self action:@selector(howtoButtonTouched:)]; self.navigationItem.rightBarButtonItem = btn; //ボタンのをタップしたときのアクション -(void)howtoButtonTouched:(id)sender { //使い方画面へ遷移 HowtoViewController *howtoViewController = [[HowtoViewController alloc] init]; [self.navigationController pushViewController:howtoViewController animated:YES]; } どなたか、良い方法があればご教授頂けますと 大変ありがたいです。

  • [iPhoneアプリ開発]継承クラスを作らず

    Objective-cでiPhoneアプリを作っています 自前でクラスを作らず(.hファイルと.mファイルを作らず)別のファイルで基本的なクラスのインスタンスを作ってその場で設定したいんですが、どうすればいいでしょうか。 例えば、ある画面のコード(ViewController.mにします)で UITableViewController *foo = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]; (TableViewを表示させたい) と書き、その画面(ViewController)内のボタンやラベルを押せばfooに遷移できるようにします。 すると、確かに遷移はできるのですが何も無いページが表示されるだけです。 TableViewなので設定(セクションのタイトルだとかセルの数だとかを決める)をしなければ何も表示されないのは当たり前ですよね。 この設定をViewController.m内で行いたいのです。 いつもならUITableViewControllerを継承したクラスを作りそこで設定を行なっていました。 今回はそれを作りたいくない、というわけです。 できますでしょうか。 ちなみに遷移に関してですが、NavigationControllerを想定しています。 よろしくお願いします。

  • iphoneアプリ開発についての質問です

    http://okwave.jp/qa/q8846564.htmlの質問に補足を付け加えたものです。 storyboardのprototype cellsでカスタムセルを4つ作成しidentifierも設定した状態で、 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static const id identifiers = { @"MetaCell", @"StatusCell", @"EvoCell", @"FormCell" }; NSString *CellIdentifier = identifiers[indexPath.section]; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 以下略 という風にしているのですが UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath: というエラーが出てしまいます。 identifierの文字列は何度見ても一致していました。 if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 上記のコードを追加しても、一応エラーは出ませんが当然セルは反映せず真っ白のままです。 if (cell == nil) { if (indexPath.section == 0) { cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; } else if (indexPath.section == 1) { cell = [tableView dequeueReusableCellWithIdentifier:@"StatusCell"]; } else if (indexPath.section == 2) { cell = [tableView dequeueReusableCellWithIdentifier:@"EvoCell"]; } else if (indexPath.section == 3) { cell = [tableView dequeueReusableCellWithIdentifier:@"FormCell"]; } } 一応このようなやりかたでも試しましたが結果は同じでした。 ちなみにこのテーブルビューへは前のビューからsegueで (void)[[segue destinationViewController] initDetailDic:dic]; で遷移してきています。 何度調べても原因がわからず困っています。心当たりはないでしょうか。 *補足 問題の起こっているこのテーブルビューへは、前のテーブルビューから遷移してきているのですが試しにNavigationControllerのrootViewに設定してみたところちゃんと表示されました。画面遷移の方法に原因があると考えられるのですが、上に書いたやり方はごくごく一般の方法だとおもうのですが・・・

専門家に質問してみよう