通过自动布局在 UIScrollView 中使用顶部布局指南

2024-03-21

I want to use the Top Layout Guide in the UIScrollView through Auto Layout. Without the UIScrollView Auto Layout works well with Top Layout Guide. enter image description here

But when I embed the UIButton in UIScrollView, it doesn't. enter image description here

我知道那是因为UIScrollView与 不在同一层次结构级别Top Layout Guide。但我认为可能有一个好的解决方案来解决这个问题。


你感到困惑是对的。这有点违反直觉,但是顶部和底部布局指南与配置 UIScrollView 无关以便其可滚动内容将位于半透明导航栏下方,这就是您想要实现的效果。

该怎么办

鉴于第二张图片中显示的视图层次结构,这就是您在 iOS8 上需要执行的操作:

  1. 配置视图控制器,以便选中“在顶部栏下延伸边缘”(在代码中,使用edgesForExtendedLayout)。这将确保视图控制器布局其根视图,使其位于导航栏下方。

  2. 配置滚动视图约束,以便滚动视图的顶部边缘与其超级视图的顶部边缘的偏移量为零,not距顶部布局指南的空间为零。这将确保集合视图填充根视图,从而也覆盖导航栏,这是滚动视图的内容能够在导航栏下方滚动所必需的。 (IB 可能会在这个问题上与你争论。请参阅下面的脚注。)

  3. 那么现在如何确保滚动视图知道导航栏在哪里,以便(例如)它不知道always将其内容放置在导航栏下方?答案与布局指南无关。在视图控制器中,选中“调整滚动视图插入”框(或在代码中,automaticallyAdjustsScrollViewInsets)。这将导致视图控制器自动调整滚动视图的contentInset属性,以便滚动视图适当地定位其内容。

这会起作用。

这是怎么回事

那么为什么这是这个答案呢?为什么如此令人困惑?

坦率地说,很容易混淆,因为顶部和底部布局指南作为传达有关半透明覆盖元素的布局信息的元素突出地呈现给我们。然而,它们并不是唯一的“半透明感知”布局机制。它们仅与“普通”子视图的定位直接相关,即与视图控制器的根视图无关,并且与 UIScrollView 中的内容无关。

滚动视图(或 UICollectionView 和 UITableView 之类的子类)中的内容始终以更复杂的方式定位,涉及滚动视图本身,受诸如以下属性的影响contentInset, contentOffset等等(真的,如果滚动视图布局是一件简单的事情,为什么苹果在过去四年里专门举办 WWDC 会议来讨论滚动视图布局?!)

总而言之,如上述步骤所示,three用于管理布局的不同半透明感知机制如下:

  1. 延伸边缘确定视图控制器是否定位其根视图,使其位于导航栏下方。

  2. 布局指南提供一个指标来告诉“主要”内容区域在哪里,并考虑到半透明条。您可以将它们与自动布局一起使用来定位普通视图,这样它们就不会重叠。或者您可以访问代码中的数值。

  3. 滚动视图插图是确保滚动视图的内容可以重叠但并不总是重叠的正确方法。这automaticallyAdjustsScrollViewInsets在简单的情况下,视图控制器上的属性可以自动为您执行此操作。 (大概,这个属性只会导致视图控制器更新滚动视图的contentInset基于它通过布局指南公开的相同值。因此,如果您需要自己管理插图,那么您就可以这样做。)

对抗IB的布局指南狂热

关于“与IB战斗”的脚注:

不幸的是,当您尝试将滚动视图边缘限制到其父视图的边缘时,Interface Builder 可能会与您对抗。如果您从滚动视图按住 Ctrl 键拖动到超级视图,则当它弹出要在这些视图之间添加的可能约束的菜单时,它可能会尝试让您根据视图控制器的布局指南来约束滚动视图。这是因为当超级视图是根视图时,IB 盲目地更喜欢布局指南而不是超级视图边缘。但是当你使用滚动视图时,这是错误的事情.

为什么?例如,假设您接受针对布局指南的约束。然后,您的滚动视图将受到顶部约束,将其限制为 topLayoutGuide-64.0。 -64.0 是一个硬编码值,用于补偿导航栏的确切高度。那么,当天气好的时候导航栏不等于 64pt 时会发生什么情况呢?或者当您完全关闭导航栏时?或者想在没有导航栏的情况下重复使用这个场景?答案:那么你会得到一个损坏的布局。

那么,如何强制 IB 添加从滚动视图到其父视图边缘的约束,而不是布局指南呢?据我所知,答案是您无法通过在视图之间按住 Ctrl 键拖动来在 IB 中正确添加该约束。

相反,您需要选择视图,然后使用画布底部的“固定”控件。这个看起来像一个大写的 H,中间有一个盒子。在“固定”弹出对话框的顶部部分(带有显示超级视图空间限制的小图表的部分),您可以使用文本字段旁边的下拉控件来配置空间限制是否绑定布局指南或超级视图。如下所示:

演示项目的 Github 链接:https://github.com/algal/ScrollViewUnderlapDemo https://github.com/algal/ScrollViewUnderlapDemo

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

通过自动布局在 UIScrollView 中使用顶部布局指南 的相关文章

  • OS X Server 持续集成 ipa 发行版

    我们有一个配置了 SSL 证书并启用了 Xcode 的 osx 服务器 在将 OSX Server 更新到 3 2 1 和 Xcode 6 0 1 之前 一切正常 我们遇到的问题是 当集成完成后 我们单击设备上的安装按钮 它会尝试下载 但会
  • 应用内购买 - 订阅 - 不基于 Apple ID

    据我所知 如果用户使用应用内购买购买东西 它应该反映在用户拥有的所有设备中 基于登录的苹果ID 但就我而言 我需要用 我们自己的用户名而不是苹果ID 来处理它 也就是说 如果用户在多个设备上登录我们的应用程序 我们需要自己处理订阅 需要澄清
  • 如何使用 RealmSwift 存储字典?

    考虑以下模型 class Person Object dynamic var name let hobbies Dictionary
  • 键盘扩展:是否可以继承 iOS 现有键盘的功能和 UI?

    自定义键盘扩展 https developer apple com library ios documentation General Conceptual ExtensibilityPG Keyboard html是 iOS 8 中的一个
  • YUV420p 上的大量绿色 --> iOS 上 OpenGL 2.0 着色器中的 RGB

    我想使用 ffmpeg 和 OpenGL ES 2 0 为 iOS 制作一个电影播放器 但我有一些问题 输出 RGB 图像有很多绿色 这是代码和图像 480x320 宽度和高度 512x512 纹理宽度和高度 我从 ffmpeg AVFra
  • Xcode 6 本地化无法读取字符串文件

    Xcode 无法生成 xliff 本地化文件并出现错误本地化无法读取字符串文件 请检查系统日志以获取更多详细信息 有谁知道我在哪里可以找到这些日志 它是 Xcode 6 3 2 GM 但我也尝试过 6 3 1 版本 同 6 3 1 错误发生
  • 当出现alertController(actionSheet)时inputAccessoryView动画向下

    我有一个用于聊天应用程序的 inputAccessoryView 它始终保持可见并停靠在屏幕底部 用于类似于大多数消息应用程序的文本输入 当我呈现带有actionSheet样式的alertController时 inputAccessory
  • 通过 URL 中的 ID 进行 RestKit 关系映射

    假设我有一个 APIusers 1 items返回一个列表items为了userID 为 1 假设API响应如下 items id 1 description Some item 请注意 响应不包含user id用于关系映射 RestKit
  • iOS 11 文件提供程序扩展中的项目

    我有一个带有文件提供程序扩展名的应用程序 我尝试使用此方法为 ios 11 的新文件应用程序提供支持link https developer apple com documentation fileprovider content and
  • iOS中保存到照片库后获取UIImage数据

    将我的应用程序创建的图像保存到 iPhone 库并尝试将其恢复后 我遇到了问题 图像数据不同 创建图像 1 Code 我在不使用 alpha 的情况下创建图像 事实上 如果我使用 alpha 我会得到相同的结果 UIImage create
  • 将应用程序委托定义为常量?

    我正在尝试编写 iPhone 应用程序 但遇到了问题 我已经在类中声明了一个常量作为应用程序委托 define ikub iKubMobileAppDelegate UIApplication sharedApplication deleg
  • Android/iOS 上的相机远程快门如何工作?

    我最近在 Android iOS 上遇到了一个使用蓝牙的内置相机应用程序的远程快门 这是我找到的产品的示例链接 Link http www youtube com watch v cyVG76HDvh4 不是来打广告的 只是简单了解背后的技
  • Button.setImage(nil, for: .normal) 在 iOS 15 中不起作用

    我试图在 Swift 中制作一个简单的井字棋应用程序 所以我设置了 9 个带有从 1 到 9 标签的按钮并调用setImage设置圆圈和十字 这正在按预期工作 当尝试重置主板时出现问题 我将这段代码称为 for i in 1 lt 10 i
  • 创建 Android 智能应用横幅

    Android 设备有类似 iOS 6 智能应用横幅的解决方案吗 这是智能应用横幅的代码 从 Chrome 44 Beta 开始 您可以在 Android 版 Chrome 中推送您的应用程序 您网站上的本机应用程序安装横幅 请看下面的答案
  • iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

    当我从 XCode 运行按钮运行应用程序共享扩展 然后尝试共享文件时 XCode 经常显示以下错误 有人知道是什么原因造成的吗 错误 由于系统完整性保护 无法附加到进程 系统完整性保护 SIP 又名无根 是 OS X 10 11 中的一项新
  • 如何在cordova中动态加载CSS

    我正在尝试通过 xhr 请求在 cordova 中动态加载 CSS CSS 的加载不是问题 我可以通过 xhr 加载它并通过 HTML5 文件 API 将其存储到文件系统 然后我就可以得到一个完美的 URL 但是如果我通过 javascri
  • UINavigationController如何设置标题

    我有一个用于通用项目列表的控制器 视图 可以扩展它以显示自定义列表 列表和导航工作正常 但我无法更改 UINavigationController 的标题 在通用控制器中 void viewDidLoad super viewDidLoad
  • 无法找到任何至少支持 iOS 8.0 的 Xcode 安装

    我已经有一段时间没有使用 Appecelerator Titanium 的开发工具了 Studio 和 CLI 现在我尝试在 iOS 模拟器中运行现有的应用程序 从工作室我无法选择 iOS 模拟器 当我使用 CLI 并执行 appc run
  • Phonegap - 自动包含正确的科尔多瓦

    我正在 iOS 和 Android 上开发一个 PhoneGap 应用程序 并使用 git 控制我的 www 目录版本 我知道我的 HTML 文件需要包含正确的 Cordova js 文件 取决于我当前正在开发的平台 当有人在 Androi
  • 增加导航栏高度

    我有以下代码 func navbarbutton UIView animateWithDuration 0 2 animations gt Void in let current self navigationController navi

随机推荐

  • 自定义 WordPress 主题:布局图像不显示

    我正在构建一个自定义 WordPress 主题 所以我的主题文件夹包含以下文件 文件夹 header php index php footer php style css images picture 1 jpg 我的问题是我无法使用正确显
  • 检查特定输入文件是否为空

    在我的表单中 我有 3 个用于文件上传的输入字段
  • iPhone iOS 如何在适当的位置翻转/反射任何 UIView?

    我知道如何通过在其边界内重新绘制 UIImage 来翻转 反射 旋转它 IBAction reflectImageView UIImageView imageView UIGraphicsBeginImageContextWithOptio
  • 配置的 iPhone 未显示在 Xcode Organizer(或 iTunes)中

    我最近设置了应用程序 ID 和配置文件 并且能够在设备上成功测试我的应用程序 然后 我下载了一些示例 iOS XCode 项目 在部署其中一个项目并从手机中删除示例应用程序后 我无法将手机与 iTunes 同步 也无法在 Xcode 管理器
  • iOS 自动续订在当前订阅期结束时过期

    我订购了自动续订产品 5分钟后 它就过期了 我认为在Sandbox中5分钟等于1个月 当前订阅期结束时 5分钟后 不应该自动续订吗 但它已经过期了 在沙盒环境中 自动续订订阅的时间比实际时间要短得多 从这个答案 https stackove
  • 在两个单独的脚本之间共享变量[重复]

    这个问题在这里已经有答案了 我正在尝试在两个单独的选项卡中运行的两个不同的 Tampermonkey 脚本之间共享变量 我尝试在一个脚本中使用 GM setValue 然后在另一个脚本中使用 GM getValue 检索它 但没有成功 所以
  • XML:跨越其他元素的里程碑或元素

    我正在与OSIS http bibletechnologies net 开放圣经信息标准 用于描述圣经和相关文本的 XML 模式 当我第一次查看 XML 示例时 我注意到一些以前在 XML 中从未见过的奇怪之处 主要是关闭的标签 然后是逻辑
  • ANDROID_HOME 和 ANDROID_SDK_ROOT 环境变量均未导出 - Windows 10

    我是一个初学者 正在学习appium工具 尝试启动 appium 会话并收到错误 An unknown server side error occurred while processing the command Original err
  • 如何使用 mysqli 插入 MySQL

    我刚刚学习数据库 我希望能够存储用户输入 关于如何使用 PHP 获取表单数据并将其保存到数据库的基本示例是什么 还确保表单安全SQL攻击 http en wikipedia org wiki SQL injection File 示例 ht
  • Scala脚本等待mongo完成任务

    我正在编写一个简单的基于 scala 的脚本 该脚本应该将一些数据插入 Mongo 集合中 问题是 该脚本在 mongo 完成其任务之前退出 考虑以下脚本 处理该问题的惯用 最佳方法是什么 usr bin env scalas scalaV
  • 如何检查可以找到多少列字符[重复]

    这个问题在这里已经有答案了 我有一个包含 4 列的数据集 其中包含名称 其中名称的数量和名称的顺序在列之间有所不同 某些列还可以包含相同的名称两次或更多次 看起来如下 df lt data frame x1 c Ben Alex Tim L
  • SQL Server 将字符串长度减少到 8000 个字符

    我正在尝试将数据插入列数据类型为的表中NTEXT 理想情况下 它应该存储超过 8000 个字符 但在我的情况下 它会将其减少到 8000 个字符 我正在程序中运行时进行插入查询 以下是该过程正在进行的示例查询 INSERT INTO TMP
  • Eclipse 中的 CPLEX 库路径错误

    我正在使用 eclipse 进行 java 编码 我完成了代码 它在 CPLEX 库 12 6 上运行良好 我在属性 gt 库 gt 添加外部 jar gt cplex jar 中添加了库 我想更改CPLEX 12 7的库 所以我删除了以前
  • POI条形图生成一系列有问题

    我使用 JDK8 和 POI 4 1 0 使用它们的示例herea link http svn apache org repos asf poi trunk src examples src org apache poi xwpf user
  • c 中 tan(90) 的值?

    它给出的值是 557135813 94455 每次值都会保持不变吗 为什么它不显示无穷大 include
  • DISTINCT() 和 ORDERBY 问题

    我正在学习 LINQ to SQL 一切都很顺利 直到发生了一些奇怪的事情 我试着举个例子distinct 因此 使用 Northwind 数据库 我编写了以下查询 var query from o in db Orders orderby
  • 带有徽标的 A 框链接

    我想使用徽标从场景内部链接到外部 URL 常规网站 而不是 VR 这就是我所拥有的
  • 使用新安装的模块而无需重新启动交互式会话

    在长时间的交互会话 使用 ipython 中 我有时需要使用尚未安装的模块 安装新模块后 该模块可以在新的交互式会话中导入 但不能在安装之前运行的会话中导入 由于我正在使用内存中的所有变量 我不想重新启动会话 我怎样才能获得这样一个先前运行
  • 你能推荐一些Python HTTP客户端库吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想使用Python从一些网站捕获信息 我希望HTTP客户端满足这个条件 支持HTTPS 不会使用太多
  • 通过自动布局在 UIScrollView 中使用顶部布局指南

    I want to use the Top Layout Guide in the UIScrollView through Auto Layout Without the UIScrollView Auto Layout works we