【问题标题】:Persistent UIBarButtonItem in UIToolbar?UIToolbar中的持久UIBarButtonItem?
【发布时间】:2010-11-07 12:13:36
【问题描述】:

我一直在开发一个 iPhone 应用程序,它使用 UIToolbar(在 UINavigationController 的上下文中)在屏幕底部显示一个小的状态图标。工具栏最终也会有与之关联的操作图标(想想邮件应用程序)。

我遇到了一个问题,似乎每个推入导航控制器堆栈的 UIViewController 都应该有自己的一组项目供工具栏显示,因此,“状态”项目淡出并为每个视图转换返回。

有没有办法在工具栏中有一个持久性项目?我还尝试在导航控制器的初始化程序中添加该项目(我将 UINavigationController 子类化为这种方法),但仍然不行。

【问题讨论】:

    标签: iphone objective-c cocoa uikit


    【解决方案1】:

    不要使用导航控制器的工具栏,而是直接向窗口添加一个并调整导航控制器的视图框架的大小以避免它。该单一的全局工具栏将始终可见。

    如果您使用的是基于导航的应用程序模板,并且正在使用 Interface Builder,则应该执行以下步骤:

    1. 打开您的应用代理的 .h 文件。
    2. IBOutlet UIToolbar * toolbar; 添加到应用委托的实例变量中。
    3. 切换到 .m 文件。
    4. 找到[window addSubview:[navigationController view]];的行并在其后添加:
      CGRect frame = navigationController.view.frame;
      frame.size.height -= toolbar.frame.size.height;
      navigationController.view.frame = frame;
    5. -dealloc 方法中添加代码以释放toolbar
    6. 打开 MainWindow.xib。
    7. 打开窗口。
    8. 将工具栏拖到窗口底部。
    9. 将工具栏连接到应用代理的工具栏出口
    10. 现在设置工具栏 - 添加您需要的任何项目,然后在应用委托中创建您需要的任何出口和操作并连接它们。

    由于工具栏是窗口的一部分,而不是导航控制器的一部分,导航控制器不应触摸它。

    【讨论】:

    • 好的,但是这种方法会如何影响我在每个视图控制器的基础上添加或删除按钮的能力?我还是想拥有那种能力。
    • 好答案布伦特,那也是我的答案。 Tim,如果需要,您仍然可以自定义每个视图的工具栏 - 当主视图更改时,告诉工具栏显示哪些按钮以及隐藏哪些按钮。
    • 或者 Tim,使用 Brent 的原理来添加一个按钮(或分段控件等)。然后你有一个按钮出现在工具栏的“上方”,它一直停留在那里,直到你隐藏它。我使用这种方法将分段控件添加到底部工具栏(您通常只能将其添加到导航控制器的顶部),因此我可以验证它是否完全按照您的需要工作。
    • 这对你们真的有用吗?看起来我的 tableView 在导航栏下......有什么想法吗?
    【解决方案2】:

    当您将新视图推送到导航控制器时,工具栏中的视图将被堆栈顶部视图的工具栏中的视图替换。

    即使你有一个静态视图(当你推送一个新的控制器时视图不会改变),这个视图仍然会看起来是新的,因为当你将一个新的视图控制器推送到堆栈时苹果包含动画。

    【讨论】:

    • 但是滑动视图动画并没有覆盖工具栏——我必须处理的唯一动画是 [UIToolbar setItems:animated:] 的淡入/淡出。 Apple 自己似乎已经在 Mail 中击败了这一点 - 当您从电子邮件列表转换为单个电子邮件时,请注意刷新项目。
    • 如果动画没有覆盖工具栏那么项目不应该改变吗???
    • 但是每个视图控制器在工具栏中都有自己的一组项目(或者导航控制器在每个视图控制器的基础上区分这些项目集)。因此,每当我转换时,view 不会在工具栏上转换,但工具栏中的 items 会“改变”——即使这两组项目恰好是相同的。这会导致我试图避免的褪色效果。
    【解决方案3】:

    我发现这对我有用:

    CGFloat height = [self.toolbar frame].size.height;
    CGRect rootBounds = self.window.rootViewController.view.bounds;
    CGRect frame = CGRectMake(0, CGRectGetHeight(rootBounds) - height, CGRectGetWidth(rootBounds), height);   
    [self.toolbar setFrame:frame];
    [self.navigationController.view addSubview:self.toolbar];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多