Tag: 布局

自动布局引擎如何计算UI组件框架。

考虑一个需要两个输入的自动布局 视图约束 应用画面尺寸 自动布局引擎使用以下步骤来呈现UI组件的位置和大小。 UI组件的x位置 UI组件的y位置 UI组件的宽度 UI组件的高度 AutoLayout使用约束来计算以上步骤。 让我们从例子开始。 还认为iPhone是SE(屏幕宽度320像素,高度568像素) 示例1.0(x,y,宽度,高度定义) 看起来很简单的例子 框架计算 我们可以推断x,y,宽度,高度分别为50、50、100、100。 由于我们知道x,y,宽度,高度为正,因此AutoLayout Engine将在所有屏幕上呈现该视图。 示例2.0(未定义x,y位置) 它与前面的示例相似,但是现在我们定义了right和bottom约束。 框架计算 要计算视图的x位置,AutoLayout Engine使用屏幕宽度。 2.为了计算视图的y位置,AutoLayout Engine使用屏幕高度。 3.宽度和高度已明确指定(即宽度= 100,高度= 100),因此AutoLayout不会对其进行计算。 现在,x,y和宽度(即视图的高度)已知,自动布局引擎将在所有屏幕上呈现该视图。 示例3.0(宽度,高度未定义) 现在我们还没有定义视图的宽度,高度。 取而代之的是,我们在屏幕上设置视图的顶部,左侧,右侧,底部约束。 框架计算 我们可以推断出x,y的视点位置分别是50、50。 为了计算视图的宽度,自动布局引擎使用屏幕宽度 3.为了计算视图的高度,自动布局引擎使用屏幕高度 示例4.0(宽度未定义) 我们尚未定义视图宽度,而是定义了该视图水平居中于屏幕的中心。 框架计算 我们可以推断出x,y位置,视点高度分别为50、50、100。 为了计算视图宽度,自动布局引擎使用屏幕宽度。 由于视图是水平居中的,这意味着宽度的左半部分与右半部分相同。

了解自动版式项目关系

自从Xcode 6中引入自动布局以来,它已经成为iOS UI设计海洋中每位开发人员的波塞冬三叉戟。 每个移动应用程序都通过“自动布局”和“自适应布局”进行设计。 我们都对自动版式了解很多。 那么,这个博客有什么新内容? 你很无聊 !! 等等,伙计们! 直到最近,我还是大力使用Interface Builder进行UI设计的开发人员之一。 因此,以编程方式创建和使用约束对我来说几乎是最少的。 当我开始以编程方式编写约束时,我经常迷惑于first item和second item之间的关系,即从一个UI组件到另一个UI组件的约束关系。 因此想到了记下我的观察结果。 让我们考虑以下设计: 为了在IB中进行设置,我们将要求View.Leading — Super View.Leading, View.Trailing — Super View.Trailing, View.Top — Super View.Top, View.Bottom — Super View.Bottom的最小约束。 让我们看看我们添加的约束。 我们不希望我们的约束无法通过“安全区域”布局,因此我们将它们与“安全区域”相关联放置,因此不要感到困惑。 即使我们从“视图”到“安全区域”设置了限制条件,也请仔细标记,理想情况下,第一项应该是“ View 但在某些限制条件下,我们发现第一个项目是“ Safe Area 。 为什么Xcode会这样做? 🤦‍ 好的,让我们将View设置为每种情况下属性检查器中的第一项,并查看更改。 只需反转第一个和第二个项目的trailing和trailing 。 在两种情况下标记常量的值都变为负数。 让我们离开IB并以编程方式放置约束,方法是从Purple View所有约束,然后查看其行为。 什么地方出了错? 要了解上述行为,我们需要了解以下概念并进行相应的研究。 iOS坐标系 参考上面的图表,随着我们向右移动,任何UI组件的x value都会增加,反之亦然。 当我们向下移动时,任何UI组件的y […]

自动布局:朋友还是敌人? / 技巧和窍门

这是“自动版面设计”两部分系列中的第二部分 在开始本周的文章之前,我想提供一些信息,说明为什么我不能在上一个星期日上传文章。 有了所有的Iris公告(我加入Iris),我没有时间适当地审查我的草案并发布。 另外,我不喜欢发表自己不喜欢自己读的东西。 我已经说过,我真的很喜欢自动布局。 我从这个分为两部分的系列文章开始,讨论了我认为该技术具有的优势。 你们中的许多人已经知道,在这一部分中,我将与您分享一些我最喜欢的技巧和窍门,我认为这些技巧将促进您的工作流程。 堆栈视图 如果您还不了解,请使用iOS 9引入的堆栈视图,这是我自动布局时最喜欢使用的视图之一。 让我解释。 例如,您有一张照片和一个标签,并且想要对齐它们。 一个很好的解决方案是使用堆栈视图。 之后,您将不得不考虑将约束添加到VC(堆栈视图)中的单个对象,而不是其中两个。 (图片和标签) 使用字体或颜色属性左侧的+按钮 使您的应用程序具有适应性并为您的用户创造出色的体验比以往任何时候都容易。 在字体方面,iPad的分辨率需要比iPhone的分辨率大。 您可以按添加按钮轻松转到字体选择器,并为特定的大小类创建第二个字体属性。 Yay🎉Ps为了获得更好的适应性,请使用系统字体。 它是SF字体,当您想为应用程序添加可访问性支持时,它非常有用。 专注于一组特定的设备 当您开始构想并且想要在Xcode中“导入”设计并使应用程序具有自适应性时,我强烈建议您首先需要关注一组特定的设备(例如iPhone),然后是iPad。 自动布局可以节省大量时间。 您将更有条理,更有效率。 避免保证金选项 我也强烈建议您避免使用任何包含保证金的选项。 它确实会弄乱您的布局和约束。 同样,在那之后,您将搜索约束/布局出了什么问题,而我上面提到的原因将是让您整夜不知所措的原因之一。 我对自动版式及其多年来如何帮助我轻松创建自己的版式感到不满意。 在上面,您阅读了我最喜欢的提示和技巧。 不要对自动布局感到“恐惧”并接受它。

iOS自动版式和堆栈视图

自动布局是一项强大功能,可为iOS平台构建可调整大小的动态用户界面。 但是,要解决在屏幕上布局多个视图的众多限制,就带来了极大的复杂性。 使用堆栈视图来节省麻烦很方便。 堆栈视图允许以水平或垂直方式在堆栈中布局视图。 提示:增强您的Xcode🎨 为了演示起见,我使用堆栈视图和自动布局的混合与匹配构建了一个计算器应用程序用户界面。 遵循的步骤: 1)创建一个单视图项目 2)在视图控制器上添加标签,然后使用编辑器>嵌入>堆栈视图或底部的按钮将其嵌入到堆栈视图中 3)现在添加20个按钮(5行4列) 4)将按钮的每一行插入堆栈视图中。 您也可以命名堆栈视图以进行识别 5)选择所有堆栈视图,并将它们嵌入另一个称为“根堆栈视图”的堆栈视图中。 现在我们有了堆栈 6)选择“根堆栈视图”,然后为零,(0)的标准值添加4个约束,分别用于顶部,左侧,底部和右侧。 7)对根堆栈视图执行以下操作: 设置根堆栈视图填充的对齐方式 将“根堆栈视图”的间距设置为8 px iOS标准 将分布设置为均等填充 8)对所有子堆栈视图重复步骤7。 是的,您快到了! 9)似乎自动布局会留下一个小的警告。 通过选择警告来修复它并更新其框架。 现在可以使用计算器布局了。 它可以在所有屏幕尺寸和方向上流畅运行。 ‍🚒 下载完成的项目

Menggunakan Auto Layout和Trait Variations Untuk Desain自适应布局iOS

自动版面 Apitu自动布局? 自动布局adalah sebuah基于约束的布局/ untuk memudahkan开发人员mendesain布局berdasarkan ukuran布局。 Berikut menurut喇嘛resmi nya: 自动版式会根据对这些视图施加的约束来动态计算视图层次结构中所有视图的大小和位置。 Disini,saya akan membuat布局dengan 4视图( Gambar 1.1) dengan warna yang berbeda,dan ukuran dari masing-masing view akan disesuaikan dengan lebar dan tinggi yang sama。 Sesuai judul, 自适应布局 。 Saya akan mengatur untuk orientasi景观丹肖像。 帕达( Gambar 1.2),阿坎·孟加杜尔(Akan Mengatur)约束肖像,东方肖像。 红色视图, saya akan kasih 边距左,右,上,下 = 5 Untuk 粉红色魅力视图 […]

创建自己的UICollectionView API

在本文中,我们将创建一个外部框架,该框架将公开一些单元格,背景线和水平线装饰UICollectionViewFlowLayout以及一个垂直的自定义UICollectionViewFlowLayout ,该UICollectionViewFlowLayout管理单元格之间的边距和填充。 为什么要使用UICollectionview? 根据您的应用程序,使用UICollectionView来构建屏幕可以节省大量时间,主要是在您的屏幕是面向数据和上下文的情况下。 在两个其他对象之间添加一个单元比更新约束来显示或隐藏UI元素要容易得多。 UICollectionView的强大功能是DecorationView 。 在不增加单元格复杂性的情况下,您可以在其中一些背景后面添加背景,并在整个应用程序中重复使用它们。 最后, UICollectionView允许仅用几行代码即可对屏幕中的更改进行动画处理。 为什么要使用API​​? 大多数情况下,应用程序屏幕的设计是相同的:在许多屏幕中,相同的按钮,相同的元素只是内容不同但布局相同。 创建API的目的是以最简单的方式使用这些元素。 UICollectionView API的主要目标是花费更少的时间在构建屏幕上,并花费更多的时间来实现和测试逻辑,改善细节并拥有更易于维护的代码。 另一个优点是在应用程序中提供总体UI一致性,并尽可能与您的设计师提供的模型相似地创建屏幕。 科洛尔 Apple提供的用于实现UICollectionView的API是面向indexPath的。 在oui.sncf,我们创建了一个名为Collor的顶层,以实现面向数据的实现。 该库的主要目标是在一个文件中描述UICollectionView的结构。 在继续阅读本文之前,您应该看一下这两篇文章: Collor:UICollectionView的面向MVVM数据的框架 我们已经建立了一年的框架,以简化和加速我们的UICollectionView的开发。 UICollectionView:如何轻松处理更新 当您使用CollectionViews或TableViews时,困难的部分是当您需要添加,删除,移动一些单元格时… medium.com 我们走吧 1)创建自己的框架 为了优化编译时间并最小化依赖关系,最好的方法是在工作空间中创建一个框架。 我们将其命名为CollorAPI 。 如果您打算在其他项目中使用此框架,则建议您创建一个私有容器。 我们在这里不解释创建框架的过程,如果需要,您可以找到很多教程: 模块化iOS应用程序 “只要离开您的计算机去喝咖啡,应用程序就会编译!” medium.com 2)唯一的节描述符 大多数时候,唯一可定制的节描述符足以满足我们的需求。 4)垂直空间 必须对每个通用单元进行边缘到边缘设计。 然后,将在collectionView的布局中以及带有部分插图的地方处理边距和填充。 通过应用此规则,无需增加单元格的复杂性或添加空白单元格来填补空白,就更容易遵守设计屏幕。 首先,我们在builder实现此功能: 最后,collectionData如下所示: 在oui.sncf处 ,有11种装饰类型。 它们使您可以添加票证背景或建立旅程时间表。 对于时间轴,我们在部分构建器内部创建了一个嵌套构建器。 通过这种方式,角色可以很好地分离,并且其他开发人员可以轻松使用该API。 单元在布局中向右移动,以便重用它们,而不是使用内部偏移量创建新单元。 timeLineBuilder 继续,在本文中,我们介绍了您未来框架的基础。 现在就取决于您的需求了! 感谢您的阅读,并让我知道您在Twitter上的想法。

在Interface Builder中布置动态UIScrollViews

如果您正在学习或已经使用iOS一段时间,您可能已经意识到使用UIScrollViews是构建甚至稍微复杂的UI的必要条件。 您可能还意识到,要使滚动视图及其内容与AutoLayout配合使用可能会非常痛苦。 在本文中,我将解释如何在界面生成器中布局滚动视图。 我们还将看到如何使可滚动区域动态化,以便它将可改变其大小以及所显示的内容。 我不会详细介绍滚动视图的真正含义以及它可以做什么和不能做什么。如果您想了解更多有关滚动视图的信息,请查看Apple文档或本教程。 就是说,关于滚动视图,我们必须了解一件事,它们需要某种方式来了解其内容大小。 内容大小是让滚动视图知道其水平和垂直滚动区域应多大的内容。 例如,如果将内容大小(宽度和高度)简单地设置为滚动视图的框架,则它将不会滚动任何内容……但是,如果内容高度大于scrollViews框架的高度,则它将垂直滚动。 现在您可能在想:“好吧,我明白了,滚动视图的内容大小决定了可滚动区域,但是我们如何设置此内容大小的宽度和高度?”。 好了,可以显式和隐式地设置内容大小。 明确设置此方法的一种方法是直接对内容的高度和宽度进行硬编码: scrollView.contentSize = CGSize(宽度:300,高度:900) 这种做事方式既有趣又有趣,直到您意识到这不是我们想要的一切为止! 我们希望事情是动态的。 我们不一定知道内容的高度和宽度应该是什么,毕竟,这可能取决于设备的大小,方向或滚动视图实际显示的更改内容。 由于我们计划使用界面构建器和AutoLayout,因此我们希望通过设置约束来隐式设置滚动视图。 我们将使视图控制器的整个视图成为一个垂直滚动页面(这是滚动视图的常见用例)。 首先,我们将使用一个空的视图控制器“刷新对象库”并在其上拍一个滚动视图。 因此,将UIScrollView拖到视图控制器的视图上,并将其约束设置为其超级视图的边缘。 现在我们已经设置了scrollView,我们将把UIView作为子级添加到scrollview中。 此视图是“虚拟视图”,因为它仅用于布局目的。 不过,不要上当,这是一个非常重要的虚拟视图。 该视图用于确定我们喜欢的contentSize ,并包含我们希望在scrollView中显示的所有内容。 由于此视图非常重要,因此我们将其重命名并将其称为contentView 。 另一个非常重要的步骤是将内容视图的每个边缘固定到scrollView的边缘。 这些是“ 特殊”约束,它们使滚动视图知道该视图(内容视图)将用于确定内容大小。 添加这些约束后,您仍然应该会看到自动布局错误,如果您问自己为什么,我也不会怪您。 我们将内容视图固定在顶部,底部,前边缘和后边缘……为什么我们仍然遇到问题? 记得我们说过这些是“特殊”约束吗? 好吧,是的,AutoLayout与scrollViews的工作原理略有不同。 我们所做的就是告诉scrollView我们的内容视图将用于定义其contentSize,但是我们实际上并未定义内容大小。 实际的内容大小将由内容视图的高度和宽度确定。 由于目标是使屏幕垂直滚动而不是水平滚动,因此我们首先在内容视图上设置宽度约束。 此约束的目的是完全禁用水平滚动。 我们将从内容视图到滚动视图本身设置相等的宽度约束 有了这个约束,无论滚动视图占据整个屏幕还是仅占据一部分,滚动视图都知道其内容宽度将与框架的宽度完全相同。 我们仍应具有自动布局警告,因为我们尚未设置任何定义内容高度的约束。 只是为了使此工作正常进行,而不会引起界面构建器的任何投诉,让我们为内容视图的高度定义静态值。 为此,我们将对我们的内容视图应用高度限制1000(完全任意)。 恭喜你! 如果一切操作正确,您将不会再看到有关我们布局的警告。 但是,如果您注意到滚动视图继续向下经过主视图,您可能会感到恼火。 在界面生成器中延长主视图的长度是一个好主意,以便我们可以查看和操纵滚动视图的内容。 为此,我们将选择视图控制器(而不是其视图),然后转到属性检查器。 在这里,我们应该看到“模拟指标”列表,我们需要将“大小”字段从“推断”更改为“自由格式”。 这将使我们可以调整视图的高度,请记住,这些“ 模拟 指标 ”仅是在设计和布局界面时为我们提供帮助,实际上不会影响我们的应用程序。 接下来,转到视图控制器的大小检查器,并将高度设置为更适合此场景。 […]

与UIScrollView的简短相遇

我与UIScrollView进行了简短的接触,这是我要写的,因为我想记住我在工作中的Hack Day摔倒的一两件事。 但是,内容与工作有关。 而且,在尝试提出一个引人注目的与工作无关的示例时,我学到了很多有关Swift Codable的知识 ,所以我决定写些关于它的内容。 好的好的。 很好 。 我会写两个。 对于本文,我将仅介绍滚动视图。 关于绊脚驱动的开发 这是我如何通过滚动视图迷失于杂草中的故事。 巨魔和巨型蜘蛛的故事。 好吧,像那样。 这种开发风格可以称为“绊脚驱动的开发”( SDD ),有点像“沿着已知的轨迹朝着明确的目标前进,直到进展发生。” 有问题的应用程序是为工作中的Hack Day而设计的; 我很高兴实现UI。 这个应用程式打算在iPhone上显示资料资讯提供,让您放大细节,因此我选择了iOS Master-Detail范本。 通常,我立即用UITableView替换细节视图并实现自定义单元格,但是这次我不想麻烦,无论如何,在这种情况下,总体布局基本上是固定的。 布置视图 急着,我首先使用自动布局在没有UIScrollView的情况下直接在局部视图中布置局部视图。 而且,在花了很多时间进行布局之后,我犯了一个错误,那就是将它们全部都嵌入到了Editor > Embed In > Scroll View的UIScrollView中。 一切都松散了。 到处都是红色。 绊倒,绊倒,课程,课程等,等等。 为了帮助您了解所见,我在Intertubes上寻找了引人注目的数据馈送示例,并最终选择了USGS地震馈送。 只是。 因为。 为了整理提要,我认为我可以快速给新的Swift Codable协议打转,那时候我就知道了Frickin 很棒的 Codable是什么。 但这是下一篇文章。 抓紧。 细节视图的初始布局看起来像这样,与我在Hack Day应用程序中使用的布局极为相似: 我把MKMapView扔在那儿以占用空间,以备不时之需。 但是它还不够高,无法滚动。 接下来,我使字体变大,添加了更多标签视图以将其进一步垂直扩展,添加了一些字符串格式以使内容看起来更简洁,并使用自动布局将视图连接起来。 对于标题,位置和详细信息视图,我使它们紧贴右边缘并具有零行,以用于多行换行文本。 我将视图组放在堆栈视图内地图视图的右侧,只是使布局有些复杂和令人恐惧。 我的目的不是要尽可能以最佳方式显示此数据,而只是使视图向下延伸足够远,以至于实际上需要滚动内容才能看到底部,因此: 哦。 当然,滚动是可取的。 […]

图书馆和数据库

事实证明,在各个幼儿园之间骑自行车游览并不是完成很多工作的好方法。 谁会打它呢? 昨天很有趣,但我仍然设法使清单上的至少一件事完整。 对我来说,这是一个胜利。 在昨天的帖子中,我提到了几天前所做的研究,试图为我的应用程序选择后端服务。 简而言之,我决定使用Google的Firebase产品,实际上是他们仍处于测试阶段的Cloudstore。 使用仍处于测试阶段的内容的想法可能会吓到某些人,或者使您怀疑我的判断。 但是,正如我现在已经明确指出的那样,我只是在此阶段瞄准最低限度可行的产品,而将整个产品基于beta产品的风险很小(没有?)。 我会让您知道,我对这一选择进行了很多思考,这可能比我的项目所需要的要多,而这在此时仍只是我的想象力。 我的研究确实做了一件很棒的事情,我发现它对未来充满了希望:编写自己的后端服务的想法听起来真的很有趣。 我读得越多,就越会深深地想到Firebase,Realm等解决方案非常适合以很少的时间和资源(我的实际情况)启动并运行某些解决方案。 对于大多数自定义操作,并且显然是独立的,编写自己的服务器端代码和API是理想的选择。 我只想为学习体验而尝试一下,再加上一些其他语言的介绍。 是的,我知道Swift也可以是服务器端语言,但是我想深入了解Python和Ruby,并了解它们可以带给我的力量。 我迫不及待地想要扩展我的工具箱,使其包含更多的语言,并对全栈有更多的了解。 当我说我的待办事项清单很长时,请相信我,最困难的部分是将我应该首先学习的内容放在优先位置。 就像我在上面说的那样,昨天并不是一个总的“损失”,而我用这个词是宽松的,因为我确实解决了自动布局所带来的一些问题。 仍然有一些警告,因此我想我仍然有很多事情要学习,但是我能够在所有iPhone屏幕尺寸上启动该应用程序,并且表现出我的预期。 结果,我今天可以继续进行一些严肃的编码。 大肆宣传!

改善您的自动版式游戏。

它是如何工作的? 为了使自动版式的性能更好,我们首先需要了解其在引擎盖下的工作方式。 当您指定约束时,它们将传递到布局引擎,然后由布局引擎计算视图的适当大小和位置属性。 关系越复杂,计算所需的时间就越多。 但是稍后会更多。 在那之后,引擎告诉系统在屏幕更新后要考虑新的布局约束。 1.约束阶段从层次结构中最接近的视图到最远的视图(例如,从叶子到根)按顺序计算布局。 2.布局阶段调用方法的顺序相反。 在该阶段,所有视图均根据约束条件进行适当布局,并设置框架。 3.最后一个领域是更新屏幕。 自动布局问题。 1.多次创建约束。 如今,这是最不常见的错误。 过去,程序员倾向于在updateConstraints方法中创建约束,这会导致引擎每帧再次重新计算约束。 解: 设置视图内容后立即将布局代码置于视图初始化中的常见位置,或者在需要时创建一个标志以在updateConstraints方法中使用。 解: 上) 如果视图的约束与视图的直接同级和祖先相关,则引擎可以执行线性时间复杂度的计算,如下所示。 3.不必要的限制 当您有一些当前在屏幕上不可见的视图时,您无需关心它们的布局,因此我们可以减轻布局引擎的障碍。 解: 最有效的方法是将视图属性isHidden设置为true并停用约束。 我将使用不同的框架设置这种简单的布局,以演示语法和逻辑。 视觉格式语言 NSLayoutConstraint类 布局锚 解: 您可以使用第三方DSL(用于自动布局的包装器)扩展自动布局,对我而言,它们比Apple提供的更好。 SnapKit 品纳 制图学 5.难以调试 一直很难确定约束出了什么问题,尤其是在布局复杂的情况下。 现在,由于调试器变得非常聪明,它会变得容易得多,它会告诉您是否有问题。 而且,如果您使用情节提要板,则会出现警告,以防止您放置多余的/冲突的约束。 不是解决方案,而是提示: 您可以将SymbolicBreakpoint与UIViewAlertForUnsatisfiableConstraints符号一起添加。 它将使用汇编代码停止执行,您可以在其中转储通过在控制台po $rbx打印而破坏的视图和约束数组,或使用po $r14获取更多信息。 如果要查看有关所有子视图和特定视图约束的信息,请使用po .recursiveDescription (可能需要unsafeBitcast(_:)放到UIView.self ) 但是,还有更多: 如果要向自动布局发出信号,则视图需要一定的空间来容纳其内容,类似于UILabel和UIImageView 。 您可以覆盖intrinsicContentSize 。 我希望我弄清楚了这个主题,对它有所帮助。 在下一篇文章中,我将介绍最佳的替代布局引擎,以及如何制作自己的,敬请期待🙂