草庐IT

ios - 暂时移动 UINavigationView - Facebook 风格

coder 2024-01-27 原文

我想要一个 Facebook 风格的滑盖式 UITableView。

我已经做到了,动画和投影等等。我担心的是我以完全错误的方式进行操作,结果事情并不完全正确。

应用程序有一个 rootViewController(UIWindow 的),它是一个 UINavigationController。 UINavigationController(它的 Root View Controller )中的一个 View 设置了 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 似乎已重置其框架。当通话状态栏打开和关闭时也会发生这种情况。其次,右侧 View 内的任何 View 都不会按应有的方式向右移动。我不知道这是为什么。

但是,如果我将动画 block 替换为

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

它工作正常。导航 Controller 当前显示的 View 的 subview 相应地移动,当应用程序恢复时一切都在正确的位置。但是,侧边栏 View 不接收触摸事件,在侧边栏上进行的触摸现在由 AppDelegate 处理。我怀疑这是因为 UIView 的框架起源于 {-200, 0},但我不能确定。

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

-哑光

最佳答案

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

完全按照您的意愿行事。它纤薄且随时可用。自己重新实现它只会阻止您开发实际的应用程序:-)

我在实现过程中遇到的问题以及我通过浏览您的代码可以看出的问题是多种多样的。主要是您会因为滥用 View 层次结构而遇到问题。

你现在基本上有两个 UIViewControllers 负责你的 iPhone 屏幕。 Apple 一开始并不是有意为之,因为人们认为在任何时间点都只会存在一个 ViewController。 - 这随着 iPad 和 UISplitViewController 而改变。就在最近,在 iOS 5 中,新的 API 使您可以将自己的 ViewController 添加到层次结构中。

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

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

关于ios - 暂时移动 UINavigationView - Facebook 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448927/

有关ios - 暂时移动 UINavigationView - Facebook 风格的更多相关文章

  1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  4. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  5. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  9. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐