【发布时间】:2015-12-31 18:03:13
【问题描述】:
几周以来,我一直在搜寻资源并寻找非儿童开发人员关于使自定义大小的 UIToolbar 在基于 UINavigationController 的应用程序中工作的建议。我所说的“工作”是指一种非骇客的方法,它允许诸如工具栏的优雅隐藏/显示、滑动隐藏和其他优雅动画之类的关键操作。
创建一个自定义的UIToolbar 类实例,该实例位于覆盖sizeThatFits: 的UINavigationController 实例内部,会按预期更改大小,但会导致一些不可接受的问题。
所以,这里我们有许多人提供的常见sizeThatFits: 替换:
- (CGSize) sizeThatFits:(CGSize)inSize {
CGSize sz = [super sizeThatFits:inSize];
sz.height = SS_TOOLBAR_HEIGHT;
return sz;
}
好的,很好,大小已更改,但如果您在该函数上设置断点,很明显其他 44 pt 高度仍在敲打。尝试在那里设置一个断点,看看它被调用的频率——看起来很可疑(稍后会起作用)。
好的,很好,它可以根据需要更改高度,因此我们继续添加功能,以便工具栏在触摸或滑动时隐藏(带动画)。好吧,如果我们启用 UINavigationController 的 hidesBarsOnSwipe,那么有两个问题:导航栏被束缚在隐藏处(糟糕),并且工具栏被完全隐藏,因此将它带回来完全不是所见即所得.我们的设计目标是让工具栏像抽屉一样操作,在适当的滑动方向上滑入/滑出,独立于导航栏。除了完全隐藏工具栏之外,我们还希望有一个可能有 10-20 pts 高的 lil stub/tab 事物,这表明用户可以像抽屉一样将工具栏向上滑回其正常状态。
为此,我们在 UIToolbar 派生类中更改 sizeThatFits::
- (CGSize) sizeThatFits:(CGSize)inSize {
CGSize sz = [super sizeThatFits:inSize];
sz.height = _minimized ? SS_TOOLBAR_HEIGHT_MINIMIZED : SS_TOOLBAR_HEIGHT;
return sz;
}
在最小化状态更改时,我们会自然地隐藏/显示适当的子视图,使其正常显示,或者说是 15 pts 高,带有一点抓地力图形小曲。因此,这种方法的主要问题是,由于在动画期间调用sizeThatFits: 并将其短路,现在任何尝试将工具栏动画滑入/滑出都会完全失败。好的 Apple,好的,让我们尝试一些技巧,比如在其他地方设置目标大小:
- (CGSize) sizeThatFits:(CGSize)inSize {
CGSize sz = [super sizeThatFits:inSize];
if ( _animationInProgress ) {
sz.height = _minimized ? SS_TOOLBAR_HEIGHT_MINIMIZED : SS_TOOLBAR_HEIGHT;
}
return sz;
}
好吧,事情在这一点上就像滚雪球一样疯狂。对sizeThatFits: 的调用比比皆是,并且随着 44 pt 幽灵大小胜出,对抽屉式隐藏/显示动画的尝试看起来更加破碎,一切都被搞砸了。
因此,简而言之,我正在寻找专业开发人员来分享有关如何继续使用 UINavigationController 的信息/建议,但拥有一个具有良好的动画抽屉式行为的工具栏。在这一点上,我几乎可以满足任何条件,只是“最小化”状态是 WYSIWYG 友好的,因此用户可以恢复工具栏。也许一种方法是制作一个位于底部的微小浮动 UIView 并且仅在工具栏隐藏时显示(并且当触摸或滑动时,工具栏将被取消隐藏并且动画将是流畅的)。我将如何以及在哪里坚持这种“浮动”视图?
我想是什么让我对这一切感到愤怒,为什么我觉得我在发帖寻求帮助是因为这里讨论的所需工具栏功能似乎是大多数 iOS 开发人员绝对欢迎的功能,并将视为对 UINavigationController 的重大改进+UIToolbar 的当前限制。
我在 iOS 方面有不错的经验,但我是 maaaany moons 的 OS X 和 Win 兽医,因此非常感谢其他专业开发者的帮助。
提前致谢!
【问题讨论】:
标签: ios uinavigationcontroller uitoolbar