如何根据objective-c中的滚动方向创建一个从UINavBar后面向下或向上滑动的自定义UIView?

Posted

技术标签:

【中文标题】如何根据objective-c中的滚动方向创建一个从UINavBar后面向下或向上滑动的自定义UIView?【英文标题】:How do I create a custom UIView that slides down or up from behind a UINavBar depending on scroll direction in objective-c? 【发布时间】:2014-04-10 00:27:38 【问题描述】:

目前正在构建商店应用。我有一个集合视图,显示带有价格和标题的服装图像。我希望用户能够过滤和优化结果并使用一个特殊的栏来更改页面的布局,该栏将向下滑动并在 UINavBar 下方绘制自身。

这就是我想做的:

用户开始向下滚动。 从 UINavBar 后面以所需的速度向下滑动导航栏大小的自定义视图。 用户开始向上滚动 从 UINavBar 后面以所需的速度向上滑动导航栏大小的自定义视图。 自定义视图应该是不透明的 自定义视图不应影响控制器视图并在可见时位于其顶部。

我的层次结构的一部分:

UINavigationController -> UIViewController -> UICollectionViewController

以上所有内容都将在我的 UICollectionViewController 中进行。

更多信息:

由于这是我经常做的事情,我想学习并了解如何正确地做到这一点,但我不介意使用现成的解决方案。

下面的图片可能会有所帮助..

期待您的回复。

亲切的问候

【问题讨论】:

不清楚你到底在问什么?您是否尝试过某些特定的问题? 我在问它是如何完成的。我希望我能看到一些简短的示例,收集一些资源,例如博客链接、视频,然后尝试执行此操作,然后在遇到困难时发布更新。 @LondonGuy:嘿,我更新了正确的视频。请检查我的答案的更新。 【参考方案1】:

在这里添加一个基本的下拉是非常简单的步骤。 我在这个例子中使用了here 一个 UIToolbar 来滑入和滑出

更新

video mentioned here 今天更新,为 slideIn 工具栏添加了颜色。

更新:1

请尝试GTScrollNavigationBar,如本文*** 中所述。

【讨论】:

这对我有用,但似乎随着集合视图滚动。有没有办法让它浮起来?然后我需要做的就是让它检测我何时上下滚动以及滚动的距离并使用它来触发toggleMenu方法。我可能可以与上面提到的手势识别器结合使用。 @LondonGuy 如果您显示/隐藏与 Facebook ios 应用程序相同的 UINavigation 栏,该怎么办?想想看。如果这解决了您的目的,那么您已经有了一个现成的解决方案(我会告诉您),您可以在其中将我的答案的逻辑用于下拉菜单。? 我将它作为子视图添加到 collectionView 中,这就是它与视图一起滚动的原因。 Facebook 的解决方案也适用于我。最初我可以让工具栏永久显示,但隐藏的整个导航栏和工具栏将弥补这一点。 @LondonGuy 请看我回答中的UPDATED : 1部分。 一切正常,现在我只需要向导航栏添加工具栏或某种自定义视图,并希望导航栏向上滑动。显然它不会向上滑动,但我确信实现这一点并不困难。只是改变偏移量的问题?【参考方案2】:

另一种选择是在滚动视图上添加UIPanGestureRecognizer。您可以使用translationInView 方法来了解移动视图的距离。

【讨论】:

【参考方案3】:

首先,最好将视图层次结构更改为

UINavigationController -> UIViewController-> UICollectionView & custom view 

在您当前的代码中,您是否将集合视图添加为表格视图中的单元格? 好吧,由于集合视图本质上是可滚动的,所以这不是必需的。

此外,如果您将custom view 添加到表格视图或集合视图中,custom view 将与可滚动视图一起滚动,我敢打赌,这不是您想要的。

所以你可以做的是:

1. add the `custom view` to the view of the `UIViewController`
2. add also the `collection view` to the `UIViewController`
3. implement `UICollectionViewDelegate`, `UICollectionViewDataSource` for the `UIViewController`
4. implement 'scrollViewDidScroll' in 'UIScrollViewDelegate' for the `UIViewController` to detect scroll action
5. get scroll direction as indicated here:

Finding the direction of scrolling in a UIScrollView?

6. when a scroll is detected, set the desired frame of your custom view in [UIView animateWithDuration:animations:], and adjust speed by adjusting the duration of the animation.
7. Done!

好吧,以防万一....您可以将框架的原点设置为负值,以将custom view移到UIViewController的视图之外

【讨论】:

抱歉,当前代码是 viewcontroller 而不是 tableviewcontroller。我已经编辑了我的描述以反映这一点。我会试试这个并报告。

以上是关于如何根据objective-c中的滚动方向创建一个从UINavBar后面向下或向上滑动的自定义UIView?的主要内容,如果未能解决你的问题,请参考以下文章

当项目具有动态高度时,如何根据设备方向创建动态颤动网格布局

如何确定垂直 ScrollView 的方向?

如何使用不同大小和方向的图像创建水平滚动视图?

如何更改 UICollectionView 中的滚动方向?

我如何创建两个在不同方向上相互同步的可滚动列表

如何根据文本视图内容大小设置滚动视图中的启用或禁用滚动?