2012-02-25 1 views
2

私は、FacebookのようなスライドオーバーのUITableViewを使用します。UINavigationViewを一時的に移動する - Facebookのスタイル

enter image description here

私はアニメーションと影、すべてをドロップする、ことを成し遂げてきました。私の心配は、私がそれを完全に間違ったやり方にしていることです。

アプリケーションには、UINavigationControllerである(UIWindowの)rootViewControllerがあります。 UINavigationController(そのルートビューコントローラ)内のビューには、leftBarButtonItemプロパティが設定されています。ボタンが押されたときに実行されるコードを次に示します。

- (void)showFeedList { 
    //set the feed list as showing even before it is 
    feedListShowing = YES; 
    //to show the feed list, we need to instanciate one 
    feedSelectionListViewController = [[FeedSelectionListViewController alloc] initWithNibName: @"FeedSelectionListViewController" bundle: nil]; 
    //set the frame to 200 points to the left of the screen 
    feedSelectionListViewController.view.frame = CGRectOffset(feedSelectionListViewController.view.frame, -200, 20); 

    NSInteger offset = feedSelectionListViewController.view.frame.size.width; 

    //store a pointer to the root navigation controller, and add the list view controller's view to the navigation controller's view 
    UINavigationController *navigationController = (UINavigationController *)UIApplication.sharedApplication.delegate.window.rootViewController; 
    [navigationController.view addSubview: feedSelectionListViewController.view]; 

    //animate the navigation bar, feed selection list, and this view controller's view to the right 
    [UIView animateWithDuration: LIST_SHOW_TRANSITION_TIME animations: ^{ 
     self.view.frame = CGRectOffset(self.view.frame, offset, 0); 
     navigationController.navigationBar.frame = CGRectOffset(navigationController.navigationBar.frame, offset, 0); 
     feedSelectionListViewController.view.frame = CGRectOffset(feedSelectionListViewController.view.frame, offset, 0); 
    }]; 
} 

これは本当に面倒なことであり、すべてが正しく機能するわけではありません。最初に、ユーザーが離席してアプリケーションに戻ると、UINavigationBarはフレームをリセットしたように見えます。これは、通話ステータスバーがオンまたはオフに切り替わったときにも発生します。第2に、右のビュー内のビューは、右に移動しません。なぜこれがわからないのですか?私は

navigationController.view.frame = CGRectOffset(navigationController.view.frame, 200, 0); 

でアニメーションブロックを交換する場合

しかし、それは正常に動作します。ナビゲーションコントローラによって現在表示されているビューのサブビューはそれに応じて移動し、アプリケーションが再開されるとすべてが適切な場所に配置されます。ただし、サイドバービューはタッチイベントを受け取っていないため、サイドバー上でタッチされたタッチはAppDelegateによって処理されます。私はUIViewのフレームが{-200,0}の原点を持っているため、これが疑わしいですが、私は確信することはできません。

私は何かを理解しているとは思わない。これはこれを行う正しい方法ですか?私はそれをやっている他の方法を考えることができません。とにかく、事前にあらゆる案内や提案がありがとうございます。

-mattあなたがやろうとしているまさに何あなたはすでに鉱山https://github.com/pkluz/PKRevealController

のこのライブラリを備えている探している

答えて

1

。それはスリムで使いやすいです。

実装中に遭遇した問題や、コードをスキミングしてわかることはさまざまですが、実際には実際のアプリケーションで作業することはできません。主に、ビュー階層を乱用しているために問題が発生することがあります。

基本的には、iPhone画面を管理する2つのUIViewControllerがあります。これはAppleが最初に意図していたものではなく、いつの時点でもただ一つのViewControllerが存在すると考えられていたからです。 - これはiPadとUISplitViewControllerで変更されました。そして最近、iOS 5では、新しいAPIにより、独自のViewControllerを階層に追加することが可能になりました。

問題は、FeedSelectionListViewControllerがviewWill/Did/Appear/Disappearおよび/またはrotation呼び出しを受け取ることが困難なことです。チェーンの実際の部分ではないためです。

私の答えは、私が提供するライブラリをチェックするか、UIViewController Containmentを最初に調べることです。なぜなら、あなたのコードは、特定の条件下ではうまくいかないかもしれないが、

+0

あなたのソリューションを使用するように魅力的ですが、これは私の学校の新聞のRSSリーダーが好きな私の先生のためのプロジェクトです。私はとても忙しい学生なので、申し込みをする言い訳が大好きです。私は最近、UIKitの高度な使い方で遊ぶのに多くの時間がなかったので、私は自分のスキルをアップして自分自身を実装したいと思います(私はドラッグするだけではなく、タップするだけです)、それは本当に私は何が起こっているのか分からないのです。 - 要するに、私は物事が単にそれを受け入れるのではなく、その理由を知りたいのです。 –

+0

あなた自身の解決策にあなたをより良く導くための編集を追加しました。 – pkluz

+0

私は、UIViewControllerの包含メソッドを実装する独自のUIViewControllerを作成する方法を検討しています。あなたの指導に感謝します。 - しかし、私はまだ私は何がうまくいかなかったのか、とても混乱しています。私は本当になぜUINavigationBarが元の場所に戻ってきたのか、なぜUIViewがタッチイベントを受け取っていなかったのか、そしてUIViewのフレームを変更してもサブビューが変わっていないことを知りたいのです。それはすべて非常に混乱しています。 –

関連する問題