热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UICollectionView在iPhoneX上的风景。-UICollectionViewinlandscapeoniPhoneX

WheniPhoneXisusedlandscape,youresupposedtochecksafeAreaInsetstomakesuitablylargegutt

When iPhone X is used landscape, you're supposed to check safeAreaInsets to make suitably large gutters on the left and right. UITableView has the new insetsContentViewsToSafeArea property (default true) to automatically keep cell contents in the safe area.

当iPhone X被使用的时候,你应该检查safeAreaInsets,在左边和右边做出适当的大排水口。UITableView具有新的insetsContentViewsToSafeArea属性(默认为true),可以在安全区域自动保存单元格内容。

I'm surprised that UICollectionView seems to not have anything similar. I'd expect that for a vertically-scrolling collection view, the left and right sides would be inset to the safe area when in landscape (and conversely, a horizontally-scrolling collection view would be inset if needed in portrait).

我很惊讶UICollectionView似乎没有类似的东西。我希望在垂直滚动的集合视图中,在风景中,左边和右边会被插入到安全区域(反之,如果需要的话,一个水平滚动的集合视图会被插入)。

The simplest way to ensure this behaviour seems to be to add to the collection view controller:

确保这种行为的最简单方法似乎是添加到集合视图控制器:

- (void)viewSafeAreaInsetsDidChange {
    [super viewSafeAreaInsetsDidChange];
    UIEdgeInsets cOntentInset= self.collectionView.contentInset;
    contentInset.left = self.view.safeAreaInsets.left;
    contentInset.right = self.view.safeAreaInsets.right;
    self.collectionView.cOntentInset= contentInset;
}

... assuming contentInset.left/right are normally zero.

…假设contentInset。左/右通常是零。

(NOTE: yes, for a UICollectionViewController, that needs to be self.view.safeAreaInsets; at the time this is called, the change to safeAreaInsets has oddly not yet propagated to self.collectionView)

(注:是的,对于UICollectionViewController,需要self。view. safeareainsets;在这个调用的时候,对safeAreaInsets的更改还没有传播到self。collectionview)

Am I missing something? That boilerplate is simple enough, but it's effectively necessary now for every collection view that touches a screen edge. It seems really odd that Apple didn't provide something to enable this by default.

我遗漏了什么东西?这个样板文件很简单,但是现在对于每一个触摸屏幕边缘的集合视图来说都是必要的。苹果在默认情况下没有提供支持这一功能,这似乎真的很奇怪。

5 个解决方案

#1


35  

Having the same issue. This worked for me:

有同样的问题。这工作对我来说:

override func viewDidLoad() {
    if #available(iOS 11.0, *) {
        collectionView?.cOntentInsetAdjustmentBehavior= .always
    }
}

The documentation for the .always enum case says:

关于.always enum案例的文档说明:

Always include the safe area insets in the content adjustment.

在内容调整中始终包括安全区域内设置。

This solution works correctly also in the case the phone is rotated.

这个解决方案在手机旋转的情况下也能正常工作。

#2


31  

While Nathan is correct about the versatility of UICollectionView with various layouts, I was mainly concerned about the "default" case where one is using UICollectionViewFlowLayout.

虽然内森对UICollectionView的多种布局的多样性是正确的,但我主要关心的是使用UICollectionViewFlowLayout的“默认”情况。

Turns out, iOS 11 has added a sectionInsetReference property to UICollectionViewFlowLayout. The official documentation on it currently lacks a description, however the headers describe it as

事实证明,ios11在UICollectionViewFlowLayout中添加了sectionInsetReference属性。官方文件目前没有描述,但是标题描述的是。

The reference boundary that the section insets will be defined as relative to. Defaults to .fromContentInset.

section insets的引用边界将被定义为相对的。默认为.fromContentInset。

NOTE: Content inset will always be respected at a minimum. For example, if the sectionInsetReference equals .fromSafeArea, but the adjusted content inset is greater that the combination of the safe area and section insets, then section content will be aligned with the content inset instead.

注:内容嵌入将永远被尊重。例如,如果sectionInsetReference等于。fromsafearea,但是调整后的内容inset更大,即安全区域和section insets的组合,那么section内容将与内容inset对齐。

The possible values are

可能的值是

@available(iOS 11.0, *)
public enum UICollectionViewFlowLayoutSectionInsetReference : Int {
    case fromContentInset
    case fromSafeArea
    case fromLayoutMargins
}

and setting it to .fromSafeArea produces the desired results, i.e., when initially in portrait orientation:

并将其设置为。fromsafearea产生所需的结果,即。,最初在肖像方向:

initial portrait layout

then when rotating to landscape, the cells are inset such that they are entirely within the safe area:

然后当旋转到景观时,这些细胞被镶嵌在一起,它们完全在安全区域内:

iPhone X landscape collection view layout

... HOWEVER, there's currently a bug, and when rotating back to portrait after the view has been in landscape, it continues to act as if the left/right safeAreaInsets are set to the landscape values:

…然而,目前有一个bug,当视图在风景中出现后,当它旋转回到肖像时,它会继续表现为左/右的safeAreaInsets设置为景观值:

portrait layout following rotation from landscape

I've filed a radar (rdar://34491993) regarding this issue.

关于这个问题,我已经提交了雷达(rdar://34491993)。

#3


4  

Thanks to above for help. For my UICollectionViewController subClass, I added the following to viewDidLoad() (Swift 3):

感谢上面的帮助。对于我的UICollectionViewController子类,我添加了以下到viewDidLoad() (Swift 3):

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
    if #available(iOS 11.0, *) {
        flowLayout.sectiOnInsetReference= .fromSafeArea
    }
}

#4


0  

UICollectionView is intended to be flexible for a wide variety of layouts. The most common layouts are grids with multiple rows and columns, but it's possible to create non-grid layouts with UICollectionView.

UICollectionView旨在为各种各样的布局提供灵活性。最常见的布局是具有多行和列的网格,但可以用UICollectionView创建非网格布局。

UITableView, on the other hand, is designed for full-width cells.

另一方面,UITableView是为全宽度的单元设计的。

Therefore, it makes sense that UITableView would have built-in support for dealing with safe area insets, since table view layouts will always be affected by it. Because UICollectionView uses custom layouts, it makes sense to solve these issues on a per-implementation basis instead of trying to provide a one-size-fits-all solution.

因此,UITableView对于处理安全区域内嵌套有内置的支持是有意义的,因为表视图布局总是会受到它的影响。因为UICollectionView使用自定义布局,所以在每个实现的基础上解决这些问题是有意义的,而不是试图提供一个通用的解决方案。

#5


0  

Bare in mind the above solutions do not solve the case where your collection cell views (and subviews that are constrained to its cell's leading or trailing edges) are full-width to the collection view bounds and aren't set to obey Safe Area Layout Guides.

请注意,上面的解决方案并不能解决您的集合单元视图(以及被限制在其单元的前缘或后边缘的子视图)是全宽度到集合视图边界的情况,并且不会被设置为遵守安全区域布局指南。

Note: The answer by @petrsyn makes the header inset from the sides, which most people might not want and the answer by @Wes Campaigne doesn't really work correctly for full-width cells, where a subview is attached to the leading or trailing edges of the cell.

注意:@petrsyn的答案会使标题从两边开始,大多数人可能不愿意,而@Wes活动的答案在全宽度的单元格中并没有正确的工作,在这里,子视图连接到单元格的前缘或后缘。

It's imperative, especially for those coming from older projects, to set your Xib and Storyboard files to Use Safe Area Layout Guides and then use auto layout to place constraints respective to the the safe areas or do similar in code.

这是非常必要的,特别是对于那些来自旧项目的人来说,将Xib和故事板文件设置为使用安全区域布局指南,然后使用自动布局将约束分别放置到安全区域或在代码中执行类似的操作。


推荐阅读
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 如何在DataGridView中实现带有图标的单元格显示
    本文详细探讨了在C# WinForms应用程序中,如何通过DataGridView控件实现带有图标的单元格显示。文章不仅提供了具体的实现方法,还深入解析了相关技术细节,对于希望提升用户界面交互体验的开发者而言,具有很高的参考价值。 ... [详细]
  • 蓝桥杯物联网基础教程:通过GPIO输入控制LED5的点亮与熄灭
    本教程详细介绍了如何利用STM32的GPIO接口通过输入信号控制LED5的点亮与熄灭。内容涵盖GPIO的基本配置、按键检测及LED驱动方法,适合具有STM32基础的读者学习和实践。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 在探讨C语言编程文本编辑器的最佳选择与专业推荐时,本文将引导读者构建一个基础的文本编辑器程序。该程序不仅能够打开并显示文本文件的内容及其路径,还集成了菜单和工具栏功能,为用户提供更加便捷的操作体验。通过本案例的学习,读者可以深入了解文本编辑器的核心实现机制。 ... [详细]
  • 在循环读取文本文件时,经常会遇到一些常见的错误,如日期格式不正确、文件路径错误等。本文详细分析了这些问题,并提供了具体的解决方法,包括如何正确处理日期字符串和确保文件路径的准确性。通过这些方法,可以有效提高数据读取的稳定性和可靠性。 ... [详细]
  • 深入解析 ELF 文件格式与静态链接技术
    本文详细探讨了ELF文件格式及其在静态链接过程中的应用。在C/C++代码转化为可执行文件的过程中,需经过预处理、编译、汇编和链接等关键步骤。最终生成的可执行文件不仅包含系统可识别的机器码,还遵循了严格的文件结构规范,以确保其在操作系统中的正确加载和执行。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 在iOS平台上,应用的流畅操作体验一直备受赞誉。然而,过去开发者往往将更多精力集中在功能实现上,而对性能优化的关注相对较少。本文深入探讨了iOS应用性能优化的关键要点与实践方法,旨在帮助开发者提升应用的响应速度、降低功耗,并改善整体用户体验。通过具体案例分析和技术解析,文章提供了实用的优化策略,包括代码层面的改进、资源管理优化以及界面渲染效率的提升等。 ... [详细]
  • 在iOS开发领域,针对不同屏幕尺寸的适配一直是开发者关注的重点。本文聚焦于iPhone 6/6 Plus的适配策略,特别是通过AutoLayout技术在淘宝客户端中的实际应用案例,为开发者提供了一套系统而有效的解决方案。文章不仅详细解析了AutoLayout的工作原理,还结合具体实例,探讨了如何利用这一工具实现界面元素的灵活布局,确保应用在各种设备上都能保持良好的用户体验。这对于正面临多设备适配挑战的iOS开发者来说,无疑是一份宝贵的参考资料。 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
author-avatar
陈政德169384
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有