使用UINavigationController为Pros

时间:2015-10-03 17:49:49

标签: ios uinavigationcontroller uitoolbar

几个星期以来,我一直在搜索资源并搜索关于在基于UINavigationController的应用程序中自定义大小的UIToolbar工作的非kiddo开发建议。通过“工作”我的意思是一种非hackish方法,允许关键的事情,如优雅的隐藏/显示工具栏,滑动隐藏,和其他优雅的动画。

使覆盖UIToolbar的{​​{1}}实例内的自定义UINavigationController类实例按预期更改大小,但结果会出现几个不可接受的问题。

所以,在这里,我们有许多人提供的常见sizeThatFits:替换:

sizeThatFits:

好的,很好,大小已经改变了,但是如果你在这个功能上设置断点,很明显还有其他东西仍在为那个44磅的高度敲打。尝试在那里设置一个断点并查看它被调用的频率 - 看起来很可疑(这将在以后发挥作用)。

好吧,很好,它会随着我们的喜好改变高度,所以我们继续添加功能,以便工具栏在触摸或滑动时隐藏(带动画)。好吧,如果我们启用UINavigationController的 - (CGSize) sizeThatFits:(CGSize)inSize { CGSize sz = [super sizeThatFits:inSize]; sz.height = SS_TOOLBAR_HEIGHT; return sz; } ,那么就会出现两个问题:导航栏被绑定到隐藏(yuck),工具栏被完全隐藏,因此将其恢复为完全非-WYSIWYG。我们的设计目标是使工具栏像抽屉一样在适当的滑动方向上滑入/滑出,独立于导航栏。进一步而不是完全隐藏工具栏,我们希望有一个lil存根/标签可能高10-20分,这表明用户可以将工具栏向上滑回,就像抽屉回到正常状态一样。

为此,我们在UIToolbar派生类中更改hidesBarsOnSwipe

sizeThatFits:

在最小化状态变化时,我们自然会隐藏/显示相应的子视图,以便它可以正常显示,或者说,例如,15点高,带有一点小小的图形小调。因此,这种方法的主要问题是,现在任何在工具栏动画中将其滑入/滑出的尝试都可以完全恢复,这要归功于在动画期间调用- (CGSize) sizeThatFits:(CGSize)inSize { CGSize sz = [super sizeThatFits:inSize]; sz.height = _minimized ? SS_TOOLBAR_HEIGHT_MINIMIZED : SS_TOOLBAR_HEIGHT; return sz; } 并使其短路。好的Apple,好的,让我们试着用其他方式设置目的地大小:

sizeThatFits:
好吧,事情就是在这一刻滚雪球般的疯狂。呼叫- (CGSize) sizeThatFits:(CGSize)inSize { CGSize sz = [super sizeThatFits:inSize]; if ( _animationInProgress ) { sz.height = _minimized ? SS_TOOLBAR_HEIGHT_MINIMIZED : SS_TOOLBAR_HEIGHT; } return sz; } 比比皆是,尝试抽屉般的隐藏/显示动画看起来更加破碎,因为44磅幽灵大小胜出,将所有事情都搞砸了。

因此,简而言之,我正在寻找一个专业开发人员来分享有关如何继续使用UINavigationController但有一个工具栏具有良好表现的动画抽屉式行为的信息/建议。此时我几乎可以解决任何问题,只是“最小化”状态对WYSIWYG友好,因此用户可以恢复工具栏。也许一种方法是制作一个位于底部的微小浮动UIView,仅在隐藏工具栏时显示(当触摸或滑动时,工具栏将被取消隐藏,动画将变得流畅)。我如何以及在哪里坚持这种“浮动”的观点?

我想是什么让我了解了所有这些以及为什么我觉得我在愤怒中发帖帮助这里讨论的所需工具栏功能似乎是大多数iOS开发人员绝对欢迎的功能,并且会看到UINavigationController的重大改进+ UIToolbar目前的局限性。

我在iOS上有不错的经验,但我是OS X并赢得了maaaany卫星的维护,因此非常感谢来自其他专业开发者的帮助。

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试覆盖-intrinsicContentSize。

答案 1 :(得分:0)

尝试这种方式:

  1. 将新的视图控制器拖到故事板中。
  2. 将工具栏拖到该窗口上。
  3. 向工具栏添加约束:前导,尾随,底部,高度。
  4. 将工具栏的标签设置为1。
  5. 将容器视图添加到视图控制器。
  6. 添加约束:
    • 顶部空间到顶部布局指南
    • 底部空间到底部布局指南
    • 超级视野的领先空间( NOT MARGIN
    • Superview的尾随空间
  7. 删除容器视图链接到的视图控制器。
  8. ⎈Ctrl -Drag从容器视图到导航控制器。选择“嵌入。”
  9. 将故事板入口点(从左侧淡入的箭头)移动到主视图控制器。
  10. 子类UINavigationController
  11. 覆盖您的子类:

    - (UIToolbar *)toolbar {
        UIToolbar *toolbar = (UIToolbar *)[self.parentViewController.view viewWithTag:1];
        if (!toolbar) {
            return super.toolbar; // prevent errors on app launch
        }
        return toolbar;
    }
    - (void)setToolbarHeight:(CGFloat)height {
        for (NSLayoutConstraint *constraint in self.toolbar.constraints) {
            if (constraint.firstAttribute == NSLayoutAttributeHeight) {
                constraint.constant = height;
            }
        }
        [self.parentViewController.view layoutSubviews];
        [self.toolbar layoutIfNeeded];
    }
    // if you need:
    - (CGFloat)toolbarHeight {
        for (NSLayoutConstraint *constraint in self.toolbar.constraints) {
            if (constraint.firstAttribute == NSLayoutAttributeHeight) {
                return constraint.constant;
                break;
            }
        }
        return -1;
    }
    
  12. 注意:工具栏中的所有视图都会停留在工具栏的底部。

    注2:这适用于动画,只需在self.toolbarHeight = ###方法中设置-animateWithDuration:

    重要提示:如果缩小工具栏的高度,请务必将toolbar.clipsToBounds设置为YES