Tag: 自动

使用Swift探索视觉格式语言

几周前,我开始介绍如何在Objective-C和Swift中使用自动布局的想法,以确保我的应用在所有iOS设备上都能正确显示。 您可以在Interface Builder(IB)中创建约束或以编程方式构建约束。 具有视觉设计的背景,我立即着迷于IB,因为它使我想起了许多设计程序。 实际情况似乎是,构建程序约束的时间往往会被可能与您的项目一起工作的其他人重用和可读性更高。 因此,我很想知道是否可以通过某种方式在视觉上构造程序约束。 使用视觉格式语言输入约束。 视觉格式语言 视觉格式语言允许您使用视觉语法字符串构建程序约束。 想法是文本在视觉上与布局匹配。 这是摘录的Apple文档: 完整的布局线 H:|-[查找]-[findNext]-[findField(> = 20)]-| 让我们分解一下: H :(水平)//水平方向 | (管道)// superview -(破折号)//标准间距(通常为8点) [](方括号)//对象名称(uilabel,unbutton,uiview等) ()(括号)//对象的大小 因此,如果我们要说一句话,我们会说findButton是距超级视图的开头(左边缘)的填充点(空白)为8点,而距findNextButton的开头的填充点为8点。 findNextButton是距findField的开头的8个填充点。 最后,findField的大小至少为20点,并且距超级视图的尾部(右侧)有8个填充点。 上面的代码特别有趣的是,它同时处理(设置)对findButton,findNextButton和findField的所有水平约束。 这里发生了很多魔术,所以我将尽力向您介绍如何在模拟项目中实现此功能的基本示例。 在一个快速的项目中,我们需要向您的超级视图添加一些对象,我们也可以附加约束。 我还喜欢为您的对象添加背景色,以便在测试约束时可以看到它占用的空间: 覆盖func viewDidLoad(){ super.viewDidLoad() //创建四个视图对象以表示我们的超级视图中的元素 让topBar = UIView() 让middleFrameTop = UIView() 让middleFrameBottom = UIView() 让bottomBar = UIView() //设置这些子视图的背景颜色 topBar.backgroundColor = UIColor.grayColor() middleFrameTop.backgroundColor = UIColor.orangeColor() middleFrameBottom.backgroundColor […]

使用EasyPeasy掌握自动版面设计I:简介

欢迎使用本系列教程,这些教程将教您自动布局,从最基础的知识到您可能会发现的布局最复杂的任务。 尽管仅涉及使用NSLayoutConstraints编程工作, NSLayoutConstraints大多数内容都可以推断为使用Interface Builder。 十分简单 我们将使用EasyPeasy代替纯UIKit 。 有很多流行的Auto Layout库,它们提供了使AL更简单的语法糖,例如SnapKit , Cartography或PureLayout ,那么,为什么要使用EasyPeasy? 简单性:提供一种简洁但功能强大的领域特定语言。 类固醇上的自动布局:提供其他一些附加功能,例如冲突解决,有条件地应用约束,特征集支持,在不保留引用的情况下更新约束以及简洁的调试模式。 可靠性:也许由于其在近1年的使用寿命中100%的代码覆盖率,尽管安装了120个CocoaPods和190个存储库克隆(每周编号),但尚未报告任何实际错误。 但是,如果这还不够的话,那就是上述库的简短比较:

@autoclosure什么,为什么以及何时

对约翰和帕维尔说“早上好” : 让我们对罗伯特说“早上好” : 让我们传递false作为第一个参数:罗伯特没有“早安” 。 但是输出窗口仍然显示出GiveAname函数: 预期:调用GiveAname()获得一个字符串,并将该字符串传递给goodMorning 。 第一个参数为false ,因此在这种情况下不使用第二个参数。 但是会调用功能GiveAname 。 如果我不希望调用GiveAname ,则应该使用闭包: @autoclosure可能很有用。 例如,这是一个断言函数: func assert(_条件:@autoclosure()->布尔,_消息:@autoclosure()->字符串) 这两个参数都可以是常量,变量或闭包: 让我们将此断言函数更改为仅在允许调试时才起作用: 在现实生活中,它看起来有些复杂,但含义相同: 公共功能断言 1.函数中的参数可以用不带参数的闭包代替,并返回与参数相同类型的值。 2.可以使用@autoclosure属性标记此类关闭参数。 3.无需在此类@ autoclosure-d参数周围加上括号。 值,传递的另一个函数或表达式自动用花括号包装。 4.用作已标记的关闭参数的另一个函数只有在从函数体中显式调用之前,才执行。 闭包– Swift编程语言(Swift 4.2) 注意如果您不熟悉捕获的概念,请不要担心。 下面在捕获中详细说明… docs.swift.org

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 粉红色魅力视图 […]

改善您的自动版式游戏。

它是如何工作的? 为了使自动版式的性能更好,我们首先需要了解其在引擎盖下的工作方式。 当您指定约束时,它们将传递到布局引擎,然后由布局引擎计算视图的适当大小和位置属性。 关系越复杂,计算所需的时间就越多。 但是稍后会更多。 在那之后,引擎告诉系统在屏幕更新后要考虑新的布局约束。 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 。 我希望我弄清楚了这个主题,对它有所帮助。 在下一篇文章中,我将介绍最佳的替代布局引擎,以及如何制作自己的,敬请期待🙂