Tag: 约束

自动布局Swift 3

Un enquequevíacódigo ¿Quées el自动版式? 在自动布局和手动模式之间,在手动和手动模式下进行可视化。 Hay dos Implementaciones del Autolayout,无需使用Storyboard或Apple llama的InterfaceBuilder,也可以使用基于锚点的方法进行操作 。 安博斯(Ambos)征服了儿子的证明,并证明了他在西班牙的保护性和合法性。 界面生成器 Echemos un vistazo a la manera como funciona Interface Builder。 Cuando abrimos和Storyboard aparece un rearea se de no nos mover las vistas y empezar a jugar con ellas。 阿奎斯·唐德·科多恩扎 弱势群体,维莫斯·辛科·埃尔拉门蒂斯·德·伊基奎尔达·德·雷科查·阿尔·佩雷斯,《现实世界》,《限制条件》,《反对革命》,《反对派》,《 Herramienta podemos reubicarlas。 StackView上的segundo icono es para agrupar las vistas seleccionadas […]

使用IOS动画中的约束…

在制作子视图动画时,通常使用该子视图的约束来更改其位置或值。 基本上,“动画”定义为值或位置的变化。 IOS中的每个视图都包含一个称为“ constraints ”的属性,该属性仅是get,它给出了该视图所持有的所有约束。约束由最近的视图持有,该视图包含约束中的两个项目。 子视图之间/之间连接的约束通常由其超级视图持有。 视图所包含的所有约束均在大小检查器中列出。 子视图与其父视图之间的约束由其父视图保持。 因此,在使用约束进行动画处理时,首先我们需要找到哪种视图持有我们要设置动画的约束。 对于动画,意味着更改约束或其乘数/常量值,首先我们需要获取所有现有约束。 通过依赖约束,选择包含所需约束的视图。 要获取约束,我们可以使用仅获取属性“ constraints”,它提供了一系列约束。 为了获得每个约束,我们可以遍历结果数组。 注意:像“约束”属性一样,乘数也是“仅获取”值。 就像我们为现有约束更改常量值一样,我们无法更改乘数值。 因此,要更改乘数值,我们需要访问该约束,使其为“ .active = false”。 通过将其激活设置为false,在下一个布局更新中,自动布局引擎将删除该约束。 因此,在定义新约束之后,将其设置为“ .active = true”。 2.我们可以在定义约束的同时为约束赋予标识符。 稍后,我们可以使用“ constraints”属性来获取约束,然后可以通过使用其标识符值来访问所需的约束。 3.我们还可以定义两个具有两个不同值,具有不同标识符和优先级的约束。 但是在任何给定时间都应该只有一个处于活动状态。 因此,从已定义的这两个约束中,将其卸载。 然后,您可以根据需要通过访问这些变量来随时激活一个。

在iOS 11应用程序中使用自动布局

您是否曾经尝试过让应用在横向和纵向上都看起来不错? 分开查看风景和肖像是否令人沮丧? 制作同时支持iPhone和iPad的屏幕布局会让您发疯吗? 如果是,我将带给您一些好的做法,以克服构建支持从方向到不同屏幕尺寸的所有内容的UI的所有障碍。 Autolayout不仅使您可以轻松地在应用中支持不同的屏幕尺寸,而且还使国际化变得微不足道。 您不再需要为每种希望支持的语言制作新的笔尖或情节提要,其中包括从右到左的语言,例如希伯来语或阿拉伯语。 在此自动版式教程中,您将了解: 支持纵向和横向的应用程序 iPhone和iPad的支持应用程序 学习如何使用约束来布局视图 使用尺寸类在不同坐标下显示视图元素 使用堆栈视图可以简化布局复杂的UI的工作 我们的示例应用 图1 —在横向模式下查看(iPhone X) 图2 —以纵向模式查看(iPhone X) 图1和图2显示了我们将在本教程中构建的示例应用程序。 该应用程序支持横向和纵向方向,并且在构建时牢记iPhone和iPad的屏幕尺寸。 自动布局的基础 固定菜单 它位于编辑器的右下角,用于向不同的视图元素(如标签,按钮,文本字段)添加约束。 这些约束不过是不同视图边界之间的关系。 约束可以固定,也可以在运行时更改以达到动画目的。 图3 — Pin菜单 对齐菜单 它位于图钉菜单的左侧,可用于水平和垂直对齐中心的视图。 图4 —对齐菜单 文件大纲 它位于编辑器的左侧,可用于查看视图的层次结构,还可以查看特定视图控制器内部添加的所有约束。 图5 —文档大纲 属性检查器 这用于自定义视图属性,例如背景颜色和字体。 属性检查器 摆出我们的观点 首先,我们将一个视图添加到视图控制器并为其添加约束。 在对象库中搜索UIView并将其拖动到视图控制器中。 添加您喜欢的任何颜色并添加约束,以使视图固定在屏幕的左上角。 选择视图并打开图钉菜单并使用以下约束: 图7 —向视图添加约束 图7显示视图的高度和宽度等于75,并且顶部锚点和左侧锚点设置为8,这基本上意味着无论是iPhone或iPad,还是横向或纵向设备,视图始终具有距离视图控制器左上角的距离为8。 添加这些约束后,我们的视图控制器就是这样。 图8 —示例应用程序 添加视图和为其添加约束似乎很容易,对吗? 但是您应该永远记住,编程并不是要一次又一次地重复相同的步骤。 让我们假设我们以刚才的方式构建UI。 我们的视图控制器中总共有20个矩形,对于每个视图,我们都必须添加约束,同时要记住每个与特定视图边界接触的视图之间的关系。 […]

尺寸等级和约束:印刷效果更好

几乎每个认真进行iOS开发的人都经历了为一个人处理约束的痛苦,这对于大多数人和两个人来说似乎都是不可思议的,您永远无法真正摆脱它们的需求。 我们需要告诉OS将UI元素放置在屏幕上的位置。 这考虑了对内部变化(如动态内容)或外部变化(如形状因数,屏幕方向和旋转)的响应。 根据官方文档,有三种方法可以执行此操作: 布局用户界面的主要方法有三种。 您可以以编程方式对用户界面进行布局,可以使用自动调整大小的蒙版来自动化对外部更改的某些响应,或者可以使用“ 自动布局” 。 在这三者中,我们将讨论“自动布局”。 自动布局是在iOS 6中引入的,它是一个系统,可让我们通过创建元素之间关系的数学描述来布局用户界面。 我们根据对单个元素或元素集之间的约束来定义这些关系。 如果我们的用户界面是建筑物,则将约束视为将所有东西都放在定义的位置的脚手架。 通过自动布局使事情进展最快的方法是堆栈,固定,对齐和解析工具。 堆栈是使用自动布局而不使用约束的工具。 这就像选择各种元素并将它们放到堆栈中一样容易,因此在屏幕旋转时,它将保持内部元素之间的对齐。 堆栈视图可能是最快且无混乱的UI布局方式,但是请记住,它们是iOS 9中引入的,因此不能用于以前的版本。 好吧,裸体谈话! 让这些手变脏,在自动布局中通过引脚对齐和固定。 假设您有一个UI要求,即在potrait模式下必须有两个等号的按钮在一个按钮的下方显示,而在横向模式下,它们应彼此并排显示。 而且,我们将完成所有这些工作,而无需触及任何一行代码,保证! 我们将学习如何通过尺寸类来做到这一点。 这是一个非常酷的3×3矩阵,可以说是构建UI的最快,最有效的方法。 wAny hAny表示所有方向上的所有形状因子。 这也意味着我们在其中设置的任何元素或约束在所有设备和所有方向上都是可见的。 您的应用程序可能同时处理iPad和iPhone,因此最好放置UI中常见的元素。 当设计要求发生变化时,这可以帮助您节省时间并易于使用。 转到视图并将按钮放入其中,将它们分别命名为绿色和红色,并更改其背景颜色。 我们将从设置绿色在屏幕上的位置开始。 这将是风景和肖像之间的唯一共同约束。 按下“固定”工具,然后取消选中“到边距的约束”复选框,然后固定2个边缘(前导和顶部),如下图所示: 我们将更改Size类,因为我们希望iPhone处于纵向模式,我们将鼠标悬停在矩阵上,并将宽度Compact和height设置为Any(3×1),它将覆盖纵向模式下的所有iPhone。 接下来,如图所示,将后缘以50px固定在绿色上: 自动布局附带三个方程式,它们定义了绿色按钮与父视图的关系。 在这一点上,必须了解自动布局如何看到这些约束,等号表示项目在左侧和右侧的相等性,而不是赋值。 自动布局会努力使=符号两侧的两个实体相等,同时这样做肯定会有错误,请参阅官方文档,以了解它引发的各种错误及其原因。 现在我们已经设置了绿色按钮的位置,我们要做的就是使红色按钮完全相同,并将其放置在比绿色按钮低20px的位置。 在继续之前,请从“解决”菜单中执行更新框架。 现在,我们将使用“对齐”工具,同时选择两个按钮,然后检查“前缘”和“后缘”按钮。 自动布局足够聪明,可以解密哪个按钮的边缘与谁对齐。 更新框架,您会在绿色的顶部看到红色,并且高度和宽度相等,但是自动布局仍然会抱怨您尚未将红色绑定到Y轴。 将红色拖动到绿色下面,不用担心您不需要准确,我们可以自动布局! 完成后,将红色顶部固定为20px。 切记取消选中“边距约束”。 另外请记住,我们需要绿色按钮中的20px,下拉菜单将为您提供您要固定其位置的选项,请选择绿色。 添加约束并更新框架。 瞧! 您已经创建了无冲突的用户界面!! 在我们高兴之前,这项工作尚未完成。 我们必须在横向模式下并排显示按钮。 在文档概述中完成此操作后,您将注意到一些约束方程式变为灰色。 这是因为,我们告诉自动布局如何在iPhone纵向模式下而不是横向模式下将这些按钮保持在原位,这就是我们现在要完成的工作。 跳至文档大纲,然后选择红色和绿色。 […]

学习以编程方式创建iOS视图

在上一篇文章的结尾,我答应展示如何编写“自动布局”约束并以编程方式创建视图。 这篇文章是涵盖Swift和iOS开发许多方面的一系列文章中的第一篇。 从iOS 9开始,编码约束变得容易得多。 Auto Layout NSLayoutAnchor类在以非常流畅的方式创建约束方面提供了巨大的帮助。 但是,在达到这种流利程度之前,您需要了解和学习两个非常重要的知识: 了解视图,子视图以及两个视图,两个子视图或视图与子视图之间的关系。 学习并了解用于创建自动布局约束的语法。 因此,让我们开始吧。 参考上图,有两个全角和等高的视图,它们垂直居中放置。 视图1和视图2都是其父视图的子视图-在这种情况下,控制器的主视图位于视图1和视图2的顶部。 还需要注意的是,视图1的底部边缘正在触摸视图2的顶部边缘。 View 1的顶部,左侧和右侧边缘与Superview的顶部,左侧和右侧边缘对齐。 View 2的左,右和底边与Superview的左,右和底边对齐。 添加标签只是为了创建引用。 我们不会在这篇文章中介绍UILabel类。 让我们开始编码。 1.为了开始,我们必须首先在UIViewController类(或View类,如果愿意)中声明变量-view1和view 2。 2.我们必须添加视图1和视图2作为控制器主视图的子视图。 3.这行代码非常重要。 在这里,我们必须设置view1和view2的translationsAutoresizingMaskIntoConstraints属性。 此属性的含义是,如果将其设置为true,则会将其自动调整大小的蒙版转换为Auto Layout约束。 我们不希望那样,因为我们要定义自己的约束。 因此,我们需要将property设置为false。 4.现在我们必须为view1设置约束。 上面的代码的前三行将view1的顶部,左侧和右侧锚点设置为与superview的顶部,左侧和右侧锚点相同。 这是因为view1的顶部,左侧和右侧边缘与其superview的顶部,左侧和右侧边缘对齐。 为了激活这些约束,您必须将isActive设置为true。 这非常重要,因为默认情况下isActive设置为false。 在第4行中,view1的高度锚点设置为超级视图高度的1/2。 这是因为view1的高度是超级视图的高度的1/2。 注意:类似于在这种情况下使用的“乘数”公式,您也可以使用可以加或减的“常数”。 第5行设置背景色。 5.现在我们必须为视图2设置约束。 上面代码的前两行将view2的左锚和右锚设置为与superview的左锚和右锚相同。 这是因为view2的左右边缘与Superview的左右锚点对齐。 您也可以添加bottomAnchor约束,但是由于我想向您展示两个视图之间的关系,因此我们将其留待以后使用。 第三行将view2的高度设置为超级视图的高度的1/2。 第4行强调了自动版式的一个非常重要的方面。 它定义了view1和view2之间的关系。 这行代码将view2的顶部锚点设置为等于view1的底部锚点。 这是因为view2的顶部边缘与view1的底部边缘对齐。 这是完整的代码: 这是您应该尝试创建自己的另一个示例: 参考上图,“视图”是控制器的主视图。 您将需要为其添加背景色。 子视图1和子视图2具有相同的大小,并且是View的子视图。 子视图1和子视图2水平居中,两者之间有50个点的间隙。 子视图1的左边缘与视图的左边缘相距100个点。 […]

iOS开发课程:UITableView

如何仅使用一个元素制作无限提要并一次又一次地重用它? 让我们在快速指南中使用UITableView创建一个简单的项目! 表格视图在单个列中显示项目列表。 UITableView是UIScrollView的子类,尽管UITableView仅允许垂直滚动,但它允许用户滚动表。 组成表格中各个项目的单元格是UITableViewCell对象; UITableView使用这些对象绘制表的可见行。 单元具有内容(标题和图像),并且在右边缘附近可以具有附件视图。 标准附件视图是公开指示符或详细信息公开按钮。 前者导致数据层次结构中的下一个级别,而后者则导致所选项目的详细视图。 辅助视图也可以是框架控件,例如开关和滑块,也可以是自定义视图。 表格视图可以进入编辑模式,用户可以在其中插入,删除表格并对其进行重新排序。 阅读有关Apple Developer的更多信息 创建一个新的Single View App项目。 热键:shift + Command + N 打开主板 如何将UITableView添加到情节提要? 只需按: Shift + Command + L 选择“表视图”并将其拖动到情节提要。 凉。 您的第一个表格视图已出现。 让我们设置约束以使表大小成为超级视图。 让我们在该模块中添加对该表的引用。 打开拆分模式 在视图上按Ctrl并将光标拖动到代码 写参考名 按连接 打开ViewController.swift文件。 修改文件中的代码。 你完成了! 拍! 拍! 请记住,成功的秘诀是不断学习和与同事沟通,包括自我教育。 这是有关UITableView和数据源的小指南。 在Apple Developer网站上了解更多信息。 不要停止自我教育。 GitHub项目 订阅我的帐户以获取有关新故事的通知。 如果您还有问题,请在评论中写。 我将在以后的文章中回答。

如何创建没有情节提要的应用程序?

正如我在第一篇文章中所说,这没什么大不了的,以编程方式制作UI的原因很多,最大的原因之一是90%的公司不使用情节提要,知道让我们开始登录屏幕吧…… 在现实世界中,您将从设计师那里获得屏幕,或者,如果您自己完成所有工作,则可以在素描或photoshop中创建一些设计,或者只是在纸上绘图,知道我们将专注于此,那么我们将尝试使其更漂亮 首先,让我们在项目导航器中创建两个文件,一个将是LoginController,另一个将是我们的LoginView。这很简单,我们都知道要这样做… 在继承自UIView超级类的LoginView类中,让我们创建一些属性,密码和电子邮件文本字段,就像您已经猜到的那样,并使用一个按钮让我们稍后登录主屏幕,我们将像在下面的图片中一样进行操作⤵️ 让我解释一下,首先忘记手势识别器… 我们正在闭包中创建属性,如果您不熟悉闭包,建议您访问此链接https://docs.swift.org/swift-book/LanguageGuide/Closures.html ,请记住,闭包的好处是swift是为我们管理记忆… 在此闭包中,您可以设置属性的所有属性,例如文本字段左上角的小图标,向我们显示,这是密码字段。 您可以用相同的方式创建电子邮件文本字段,以及所需的内容,知道何时清除让我们更进一步。 进一步割草,我们需要在LoginView中创建一些函数……类似⤵️ 这是什么啊 TranslateAutoresizingMask是UIView属性,可以为true或false,如果要使用“自动布局”来动态计算视图的大小和位置,则必须将此属性设置为false。 下面的代码我们可以在视图中添加子视图 我们正在写的所有代码都知道,您可以在许多函数中进行区分,但是我们不会那样做。 如何设置这个约束? 一点也不难⤵️ 如该图所示,我们拥有创建视图约束所需的所有锚点…重要的是不要忘记将isActive属性添加为true,因此此约束可以立即处于活动状态……默认为false😒 这个丑陋的白色错误表明密码文本字段的顶部锚点与电子邮件底部锚点之间的常量设置为10,只是不要忘记您是否是第一次进行此操作,这可能会有些混乱…… 在我们的视图类中要做的最后一件事是设置初始化程序并调用我们的方法……⤵️ 知道容易的部分😀 让我们将视图设置为LoginController… 首先,我们需要创建登录视图的实例,此后,我们需要创建函数以添加视图⤵️ 这样就很容易,并且可以通过某些视图扩展,约束扩展,协议等来简化(容易得多)……但这是更高级的方法,我们将在以后的课程中进行介绍……并且不要忘记在setLoginView func中调用viewDidLoad,并在appDelegate文件中设置初始视图控制器

我们如何为iOS动态更改布局

什么是动态更改的布局? 由于设备尺寸的不同,此布局也有所不同。 我上一个项目时遇到了此类问题。 主要思想是缩放屏幕上我们拥有的所有内容。 因为更大的屏幕需要更多的调整。 如何解决? 您可能会得到的第一个想法是“尺寸等级”。 实际上,我们最初也使用了此方法,但这还不够。 当项目增长时,控制器也将增长。 这导致对每个尺寸类别使用更多不同的约束。 当您尝试更改任何内容时,这会使您的生活如地狱般艰难。 这些并不是我们使用此想法遇到的所有问题。 有些控制器的UI非常复杂,几乎与任何设备都不一样,因此我们被迫使用几乎所有可能的尺寸等级。 想象一下,当您需要为iPad进行某些更改时,可能会浪费大量时间来寻找iPad的位置。 当我们不想更改约束常数,而是更改其乘数或优先级时,就会出现一个更大的问题。 在size类中实际上是不可能的。 相反,您需要为每个尺寸类别创建不同的约束,并在其中包含所需的值,否则,将对该约束的其他尺寸类别禁用该约束。 我们到底会得到什么? 最终,这种方法真的很难支持,它不灵活,情节提要变得非常复杂,我们有很多难以处理的约束。 最后,无法区分4s,5、6等设备(将来列表可能会更大)。 新分辨率的设备呢? 我们需要为这些创建新的UI。 这意味着我们可能需要在新设备发布时更新代码并将新版本上传到Appstore。 这可能不是项目的最佳解决方案,因为此更新可能由不熟悉先前项目体系结构的其他开发人员执行。 我可以发现的唯一好处是,所有UI工作人员均在UI文件中执行,并且未与代码连接。 这使我们的代码更加清晰。 即使有很多弊端,我们也可以接受这种方法,因为当我们打开它时,它有可能缩放所有设备的UI,这在Size Classs中是不可能的。 我们可以得出的结论是忽略尺寸等级。 下一步是什么? 我们要做的下一步是从代码更改约束值。 由于设备的差异,我们使用不同的值。 这种方法有多好? 实际上,这可能很奇怪,但是绝对比Size类好。 我们可以轻松地将此代码与其余所有代码分开。 是的,这不是明确的分离,并且代码量大量增加。 最后,代码量急剧增加。 添加新视图或更改现有视图需要花费大量时间。 但是,对于开发人员来说,情况变得更加清晰,并且情节提要文件的权重降低了。 这种方法使我们能够覆盖所有设备。 未来设备的问题仍然存在,没有人愿意回到他们以前的项目并为所有视图添加新值。 对于开发人员来说,这将是一个地狱,特别是如果该项目很大。 我想强调的是,以上所有内容都可以应用于字体以及约束。 接下来的两个解决方案可能是最好的,各有其优缺点。 最后,您只需要决定哪个更适合您即可。 先前方法的主要问题是什么? 我们需要将大量代码添加到新视图中。 这会花费很多时间,并且代码变得非常复杂和丑陋。 问题是在哪里删除此代码,或者对我们来说如何简化呢? 在IBInspectable属性中找到了该解决方案。 我们为每个更改约束常量的设备添加了约束属性。 这是一个代码示例,该代码是如何实现的。 @interface NSLayoutConstraint(BBBDevices) @属性(非原子,分配)IBInspectable […]

使用Swift(iOS)中的约束以编程方式对视图进行动画处理

您知道对我来说,应用程序开发中最有趣的部分是什么? 它正在改善用户体验(UX)。 改善用户体验的方法之一就是在应用中添加直观的动画。 我们可以通过多种方式实现这一目标,一种方式是修改如下所示的GIF之类的约束。 让我引导您完成这些简单的步骤,以实现惊人的动画效果。 首先为徽标图像定义topView。 私人懒惰var topViewForImage:UIView = { 让view = UIView() view.backgroundColor = .lightGray view.translatesAutoresizingMaskIntoConstraints = false 返回视图 }() translatesAutoresizingMaskIntoConstraints是允许我们以编程方式向视图添加约束的一种方法。 不要忘记将其设置为false 现在该创建imageView以在topView中显示一些图像了, 私人懒惰var topImageView:UIImageView = { 让图像= UIImageView() image.image = imageLiteral(resourceName:“ appLogo”) image.contentMode = .scaleAspectFit image.translatesAutoresizingMaskIntoConstraints = false 返回图片 }() 为NSLayoutConstraints定义类型为NSLayoutConstraints的高度锚点,因为我们需要在各种事件(例如keyboardWillShow()和keyboardWillHide(), var heightAnchor:NSLayoutConstraint? 现在,在ViewController中添加视图和约束。 覆盖func viewDidLoad(){ super.viewDidLoad() view.addSubview(topViewForImage) topViewForImage.addSubview(topImageView) addConstraintsToView() } func addConstraintsToView(){//向topViewForImage添加约束 […]

自动布局引擎如何计算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。 为了计算视图宽度,自动布局引擎使用屏幕宽度。 由于视图是水平居中的,这意味着宽度的左半部分与右半部分相同。