【问题标题】:Moving a UINavigationView momentarily - Facebook-style暂时移动 UINavigationView - Facebook 风格
【发布时间】:2023-03-06 21:37:01
【问题描述】:

我要使用 Facebook 式的滑动 UITableView。

我已经做到了,动画和阴影等等。我担心的是我的做法完全错误,然后事情就不会完全正确。

应用程序有一个(UIWindow 的)rootViewController,它是一个 UINavigationController。 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},但我不能确定。

我不认为我理解了什么。这甚至是正确的方法吗?我想不出任何其他方法来做到这一点。无论如何,非常感谢您提供任何指导或建议。

-马特

【问题讨论】:

    标签: ios uiview uinavigationcontroller uikit


    【解决方案1】:

    我的这个库https://github.com/pkluz/PKRevealController已经提供了你要找的东西

    完全符合您的要求。它纤薄且可随时使用。再次自己实现它只会阻止您在实际应用程序上工作:-)

    我在实施过程中遇到的问题以及从浏览您的代码中可以看出的各种问题。主要是因为您滥用了视图层次结构,所以您会遇到问题。

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

    您将遇到的问题是您的 FeedSelectionListViewController 将难以接收 viewWill/Did/Appear/Disappear 和/或轮换调用,因为它实际上不是链的一部分。

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

    【讨论】:

    • 尽管使用您的解决方案很诱人,但这是我的一位老师的项目(她想要我们校报的 RSS 阅读器)。由于我是一个非常忙碌的学生,我喜欢找借口来处理应用程序。由于我最近没有太多时间玩 UIKit 的更高级用法,所以我想提高我的技能并自己实现它(我不打算去拖动,只是点击),真的烦我,我不知道发生了什么事。 - 简而言之,我喜欢知道事情的原因,而不是仅仅接受它们。
    • 我添加了一个编辑以更好地指导您找到自己的解决方案。
    • 我想我会考虑创建自己的 UIViewController 来实现 UIViewController 包含方法。 - 感谢您的指导。 - 但是,我仍然非常困惑为什么我所做的没有用。我真的很想知道为什么 UINavigationBar 会移回原来的位置,为什么 UIView 没有接收到触摸事件,以及为什么更改 UIView 的框架不会改变它的子视图。这一切都非常令人困惑。
    • 嘿,我只想再次说声谢谢。我有一个自己设置的容器视图控制器,它运行良好。感谢您的指导!
    猜你喜欢
    • 2014-10-10
    • 2012-05-15
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多