暂时移动UINavigationView - Facebook风格

时间:2012-02-25 23:07:05

标签: ios uiview uinavigationcontroller uikit

我要去Facebook浏览UITableView。

enter image description here

我已经完成了,动画和投影以及一切。我担心的是,我是以完全错误的方式做到这一点,而事情并没有完全正确。

该应用程序有一个UINavigationController的rootViewController(UIWindow)。 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似乎已经重置了它的帧。当打开和关闭通话中状态栏时也会发生这种情况。其次,右边视图中的任何视图都不会按原样向右移动。我不知道为什么会这样。

但是,如果我用

替换动画块
    navigationController.view.frame = CGRectOffset(navigationController.view.frame, 200, 0);

工作正常。导航控制器当前显示的视图的子视图相应地移动,并且在恢复应用程序时一切都在正确的位置。但是,侧边栏视图未接收触摸事件,通过侧边栏进行的触摸现在由AppDelegate处理。我怀疑这是因为UIView的框架有{-200,0}的原点,但我无法确定。

我认为我不了解某些事情。这甚至是正确的方法吗?我想不出有任何其他方法可以做到这一点。无论如何,提前非常感谢任何指导或建议。

-matt

1 个答案:

答案 0 :(得分:1)

我的库https://github.com/pkluz/PKRevealController

已经提供了您正在寻找的内容

正是您要做的事情。它很纤薄,随时可以使用。自己重新实现它只会阻止你处理你的实际应用程序: - )

我在实现过程中遇到的问题以及从略过代码中可以看出的问题是多种多样的。主要是因为你滥用视图层次结构会导致问题。

你基本上现在有两个UIViewControllers来处理你的iPhone屏幕。 Apple最初并不打算这样做,因为人们认为在任何时候都只有一个ViewController存在。 - 这改变了iPad和UISplitViewController。最近在iOS 5中,新的API使您可以将自己的ViewControllers添加到heirarchy。

您遇到的问题是您的FeedSelectionListViewController在接收viewWill / Did / Appear / Disappear和/或旋转调用时会遇到困难,因为它实际上并不是链的一部分。

所以我的答案是检查我提供的库或首先查看UIViewController Containment,因为你的代码不能完全修复,看看它通常不是正确的方法,即使它可能在某些条件下工作。