将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样

2023-12-31

我一直在尝试向我的测试项目添加不同的交互,但在添加 Facebook 的帖子状态栏之类的东西时遇到了麻烦,该状态栏位于时间线滚动视图上,并在向下滚动时随滚动视图一起滚动视图,但当您向上滚动时仍停留在导航栏下方。

我一直在创建一个单独的 UIViewController (不是 UIView)并将其作为子视图添加到主 ViewController 中。不过,我不太确定从那里去哪里......新视图如何随滚动视图滚动?我应该使用单独的视图控制器吗?

任何帮助将不胜感激!谢谢!


以下是一些可用于入门的示例代码,只需将其添加到视图控制器即可。它使用一个通用的UIView对于浮动栏和通用UIScrollView对于滚动视图,但您可以将其更改为您想要的任何内容。

@interface BNLFDetailViewController () <UIScrollViewDelegate> {
    UIScrollView *_scrollView;
    UIView *_floatingBarView;
    CGFloat _lastOffset;
}
@end

并且在@implementation add:

- (void)viewDidLoad {
    [super viewDidLoad];

    _scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    _scrollView.delegate = self;
    _scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height * 2);
    [self.view addSubview:_scrollView];

    CGRect f = self.view.bounds;
    f.size.height = kFloatingBarHeight;
    _floatingBarView = [[UIView alloc] initWithFrame:f];
    _floatingBarView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:_floatingBarView];
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == _scrollView) {
        CGFloat offsetChange = _lastOffset - scrollView.contentOffset.y;
        CGRect f = _floatingBarView.frame;
        f.origin.y += offsetChange;
        if (f.origin.y < -kFloatingBarHeight) f.origin.y = -kFloatingBarHeight;
        if (f.origin.y > 0) f.origin.y = 0;
        if (scrollView.contentOffset.y <= 0) f.origin.y = 0; //Deal with "bouncing" at the top
        if (scrollView.contentOffset.y + scrollView.bounds.size.height >= scrollView.contentSize.height) f.origin.y = -kFloatingBarHeight; //Deal with "bouncing" at the bottom
        _floatingBarView.frame = f;

        _lastOffset = scrollView.contentOffset.y;
    }
}

你应该把它作为UIView, not a UIViewController。 iOS 开发的一般规则是视图控制器占据整个屏幕,视图用于占据部分屏幕的“子视图”(尽管 iPad 的情况较少)。无论哪种方式,一个UIViewController有自己的生命周期(willAppear, didAppear等),这对于浮动栏来说是不需要/想要的,所以它绝对应该是一个UIView.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样 的相关文章

随机推荐

  • 如何修复消息:SQLSTATE[08004] [1040] 连接数过多

    我使用下面的代码进行数据库连接 class Database extends PDO function construct try parent construct DB TYPE host DB HOST dbname DB NAME D
  • 在 GitLab CI 上测试脚本之前执行 mysql 命令

    我想在执行测试脚本之前创建测试数据库 我已经包含了 mysql 服务 但我找不到运行 mysql 命令的方法 I run mysql in before script 但它一直抱怨 bin bash line 57 mysql comman
  • .Net 添加索引到数据表(数据集)

    有没有办法在 Net 中向数据表添加索引 我有一个包含大约 1 100 行的数据表 并且 datatable select 语句对于内存中操作来说似乎有点慢 table PrimaryKey new DataColumn table Col
  • 运行 spork 时出现错误:地址已在使用中

    我假设这是因为进程没有正确关闭 所以仍在运行 但使用top或ps我找不到它 有没有办法找到它的运行位置 或者让它强制重新打开端口 try sudo netstat lpn查看正在侦听哪些端口以及正在侦听哪些进程
  • 查找 LineString 与 turfjs 中的多边形边框相交的坐标

    Turfjs 有没有办法确定 LineString 与多边形边界相交的坐标 有多种方法可以确定一个点是否在多边形内 也有多种方法可以确定一个点是否在一条直线上等等 但我似乎无法找到一种方法来询问 这条线在什么点与这个多边形的边界相交 我可以
  • 如何访问字典中的第一个和最后一个元素?

    在发帖之前 我已经经历过在Python中访问字典中的任意元素 https stackoverflow com questions 3097866 python access to first element in dictionary 但我
  • 为什么我不能使用 Set:union() 而不是 Set.union?

    我正在学习 Lua 我宁愿使用冒号 的方法 不幸的是 它并不是在所有地方都有效 看我的代码 Set local mt function Set new m local set setmetatable set mt for a b in p
  • 如何使用 RabbitMQ-JMS 恢复消费者,或指定自定义异常处理程序?

    我正在尝试使用 RabbitMQ JMS 客户端 并有意创建了一个长 onMessage 侦听器来查看客户端将如何恢复 Context context new InitialContext rabbitMQ RMQConnectionFac
  • 如果构造函数中引发异常会发生什么[重复]

    这个问题在这里已经有答案了 可能的重复 如果派生类析构函数抛出异常 基类析构函数会发生什么情况 https stackoverflow com questions 4508533 what happens to base class des
  • 创建注册表项(和子项)?

    我正在尝试创建一个注册表项和子项 以便为计算机上的所有用户启用 IE 11 企业模式 这就是我当前用于 VBScript 的内容 但它失败得很厉害 不添加密钥 我需要一些帮助来纠正这个问题 Const HKEY LOCAL MACHINE
  • 如何删除 Eclipse 项目相关文件而不从 Eclipse 中删除源

    每当我们想要使用现有源位置创建 Eclipse 项目时 我们都会选择现有源位置 根 作为项目位置 Eclipse 将在该源的根目录中创建所有项目特定文件 现在 由于某种原因 如果我们想使用不同的设置重新创建项目 我们应该如何告诉 Eclip
  • 启用 Lambda@Edge 后调试 CloudFront 的问题

    下列的本文 https aws amazon com blogs apn using amazon cloudfront with multi region amazon s3 origins 我正在尝试从 AWS 内的多个区域 同一域下
  • JAVA 面向方面编程 - 运行时方面编织和类加载时方面编织

    我看到一篇关于 AOP 的文章 其中提到切面编织可以在编译时 类加载时和运行时发生 在java中 我可以想象 甚至可以理解 方面编织在编译时实际上是如何发生的 代理类是在类编译期间生成的 在项目上启用了方面 生成的字节码将具有代理代码 但我
  • .Net Twitter OAuth 如何执行成功的 GET 请求

    按照本教程 我能够成功向 Twitter API 发布帖子并更新我的状态 但是我在处理成功的 GET 请求时遇到问题 我正在尝试修改 Post 请求来完成此操作 但在我的网络异常上不断收到 无效协议 错误 以下是将发布状态更新的工作代码 h
  • 原则 2. orm:schema-tool:update 。设置开始ID

    当我使用 bin doctrine orm fixtures load使用示例数据填充表首先迁移设置自动增量表 ID 如 1 2 3 4 5 等 第二次之后orm fixtures load迁移命令它会清除所有数据并设置 id 如 5 6
  • 如何在 Vim 中设置工作/当前目录?

    因此 当我想使用 e 命令创建新文件时 我不想指定整个路径 而只想指定新文件名 能做到吗 正如已经建议的 您可以使用 autochdir 它将更改为您打开的文件的目录 另一个选项是 cd mydirectory 这将更改目录 这可以是绝对路
  • ruby - 覆盖方法然后恢复

    我正在尝试找到一种方法 可以覆盖方法 执行某些操作 然后在不留下任何工件的情况下进行恢复 我已经使用 mocha 实现了这个 但显然这不会在生产应用程序中运行 请注意 新方法有参数 而旧方法没有 示例如下 require rubygems
  • CSS 宽度和高度属性的最大像素值是多少?

    最大有效值是多少pxCSS 的值width and height属性接受吗 我目前正在构建一个网络应用程序 它创建一个非常大的可缩放容器元素 我想知道实际的限制是什么 在元素上使用某些浏览器附带的 CSS 检查器10000000000px
  • 从 javascript 运行 bat 文件

    我正在尝试使用 javascript 运行 bat 文件 我尝试过使用 powershell 但它似乎无法正常工作 这是我尝试过的代码 var oShell WScript CreateObject WScript Shell oShell
  • 将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样

    我一直在尝试向我的测试项目添加不同的交互 但在添加 Facebook 的帖子状态栏之类的东西时遇到了麻烦 该状态栏位于时间线滚动视图上 并在向下滚动时随滚动视图一起滚动视图 但当您向上滚动时仍停留在导航栏下方 我一直在创建一个单独的 UIV