UISplitViewControllerの代替(MasterViewを縦向きで表示)

記事「ポップアップ。 iPhone SDK 3.2のUIPopoverControllerを使用して、新しいインターフェイス要素UIPopoverControllerおよびUISplitViewControllerが追加されました。 それらの最初については、Habrですでにかなり詳細に説明されています。 UISplitViewControllerについて、または、代わりの方法についてお話したいと思います。



「なぜこの代替が必要なのですか?」 これは、SplitViewの動作に関するものです。SDKからの抜粋です。「両方のView Controllerは横向きで表示されますが、Detail View Controllerのみが縦向きで表示されます」。 つまり 縦向きでは、右側(MasterView)は単純に非表示になります(図1を参照)。





図1-横(a)および縦(b)方向のSplitView



iPadのメイン設定を見ると、まったく異なる画像が表示されます。縦向きと横向きでは、左側の部分(MasterView)が同じように表示されます(非表示になりません)





図2-基本的なiPad設定



さて、 SplitViewとblackjackで地獄にいるが、左側がblackjackとwhoresで 隠れているところでは 、SplitViewを構築しましょう。



Xcode(ビューベースのアプリケーション)で新しいプロジェクトを作成することから始めましょう。 AlternativeSplitという名前を付けました(図3を参照)。





図3-新しいプロジェクトの作成



次に、メニューからFile-> New file ...-> Cocoa Touch Class-> UIViewControllerサブクラスを選択して、MasterViewController(UITableViewControllerのサブクラス)とDetailViewController(UIViewControllerのサブクラス)の2つの新しいクラスをプロジェクトに追加します。



InterfaceBuilderでAlternativeSplitViewController.xibを開き、「このような絵を描く」:





図4-AlternativeSplitViewController.xibの編集



ある方向から別の方向に切り替えるときにビューが「フロート」しないように、自動サイズ設定を構成します。 マスターの左側(NavigationBarとTableView)には、図5.aと同じパラメーターを指定し、右側の詳細(NavigationBarとView)には、図5 5.b





図5-自動サイズ設定オプション



ファイルを編集して、AlternativeSplitViewControlle.hクラスに新しいIBOutlet変数を追加します

次のAlternativeSplitViewController.h



// // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  1. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  2. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  3. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  4. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  5. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  6. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  7. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  8. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  9. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



  10. // // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .



// // AlternativeSplitViewController.h // AlternativeSplit // #import <UIKit/UIKit.h> @ class MasterViewController; @ interface AlternativeSplitViewController : UIViewController { IBOutlet MasterViewController* masterViewController; } @end * This source code was highlighted with Source Code Highlighter .







MasterViewControllerクラスは、メニュー項目を含むテーブルを担当します。 次のように書き直します(要するに、以下のコードではテーブルにデータを入力し、ユーザーがテーブルセル(didSelectRowAtIndexPath)を選択するとDetailViewメッセージを送信します):







  1. //
  2. // MasterViewController.h
  3. // AlternativeSplit
  4. //
  5. #import <UIKit / UIKit.h>
  6. @ class DetailViewController;
  7. @ インターフェイス MasterViewController:UITableViewController {
  8. IBOutlet DetailViewController * detailViewController;
  9. }
  10. @end
*このソースコードは、 ソースコードハイライターで強調表示されました。








  1. //
  2. // MasterViewController.m
  3. // AlternativeSplit
  4. //
  5. #import "MasterViewController.h"
  6. #import "DetailViewController.h"
  7. @implementation MasterViewController
  8. #プラグママーク-
  9. #pragma markライフサイクルを表示
  10. -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  11. //オーバーライドして、デフォルトの縦向き以外の向きを許可します。
  12. YESを返します。
  13. }
  14. #プラグママーク-
  15. #pragma markテーブルビューデータソース
  16. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  17. //セクションの数を返します。
  18. 1を返します。
  19. }
  20. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)セクション{
  21. //セクション内の行数を返します。
  22. return 5;
  23. }
  24. //テーブルビューセルの外観をカスタマイズします。
  25. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  26. static NSString * CellIdentifier = @ "Cell" ;
  27. UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  28. if (cell == nil){
  29. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reloadIdentifier:CellIdentifier] autorelease];
  30. }
  31. //セルを構成します...
  32. cell.textLabel.text = [NSString stringWithFormat: @ "Row%i" 、indexPath.row];
  33. 戻りセル。
  34. }
  35. #プラグママーク-
  36. #pragma markテーブルビューデリゲート
  37. -( void )tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  38. [detailViewController setNewText:[NSString stringWithFormat: @ "Row%i" 、indexPath.row]];
  39. }
  40. #プラグママーク-
  41. #pragma markメモリ管理
  42. -( void )didReceiveMemoryWarning {
  43. //ビューにスーパービューがない場合、ビューを解放します。
  44. [super didReceiveMemoryWarning];
  45. //使用されていないキャッシュデータ、画像などの所有権を放棄します。
  46. }
  47. -( void )dealloc {
  48. [super dealloc];
  49. }
  50. @end
*このソースコードは、 ソースコードハイライターで強調表示されました。




DetailViewControllerが適切な部分を担当します。 DetailViewControllerクラスを編集しましょう(新しいIBOutlet変数UILabel * lblと、lblのテキストを変更する新しいsetNewTextメソッドを追加します)







  1. //
  2. // DetailViewController.h
  3. // AlternativeSplit
  4. //
  5. #import <UIKit / UIKit.h>
  6. @ インターフェース DetailViewController:UIViewController {
  7. IBOutlet UILabel * lbl;
  8. }
  9. -( void )setNewText:(NSString *)テキスト;
  10. @end
*このソースコードは、 ソースコードハイライターで強調表示されました。




  1. //
  2. // DetailViewController.m
  3. // AlternativeSplit
  4. //
  5. #import "DetailViewController.h"
  6. @implementation DetailViewController
  7. -( void )setNewText:(NSString *)テキスト{
  8. lbl.text = text;
  9. }
  10. -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  11. //任意の方向を許可するためにオーバーライドされます。
  12. YESを返します。
  13. }
  14. -( void )didReceiveMemoryWarning {
  15. //ビューにスーパービューがない場合、ビューを解放します。
  16. [super didReceiveMemoryWarning];
  17. //使用されていないキャッシュデータ、画像などを解放します。
  18. }
  19. -( void )viewDidUnload {
  20. [super viewDidUnload];
  21. //メインビューの保持されているサブビューを解放します。
  22. //例:self.myOutlet = nil;
  23. }
  24. -( void )dealloc {
  25. [super dealloc];
  26. }
  27. @end
*このソースコードは、<a href="http://virtser.net/blog/post/source-code-highlighter.aspx"> ソースコードハイライターで強調表示されました




あとは、interfaceBuildereでIBOutlet変数をバインドするだけです(図6を参照)。 そして、問題は帽子です。





図6-IBOutlet変数のバインド



結果:





図7-別のSplitView



ソースコードはこちらまたはこちらからダウンロードできます



ご清聴ありがとうございました。

PSこの記事には、「手を少し動かすと、UITabBar パンツが回転し、UITabBar パンツが... エレガントな UISplitView ショート パンツに変わります」(iPhoneアプリケーションをiPadに移植するときの一種の松葉杖)が続きます。 書く価値はありますか?



All Articles