Tag: 布局

Swift如何改善自动版式?

如果使用自动布局,请举手。 以编程方式举手。 如果您想要一种简单的书写方式,请举手。 有很多开源项目试图使处理自动版式变得更容易。 (即砌体,PureLayout,制图) 我在这里通过介绍DHConstraintBuilder向您展示更快捷的方法。 您可能会想,“我为什么要打扰您?”,这是一个很公平的问题。 DHConstraintBuilder可以使用最少的代码来表达约束,但又不会失去任何意义。 它可以直观地显示约束的外观,同时生成有用的约束。 假设您有两个视图,并且要在它们之间放置默认填充。 使用自动版式时,该距离通常为8像素。 下面是将DHConstraintBuilder与NSLayoutConstraint进行比较的示例。 代码看起来如何? (以下两个示例在功能上等效) 使用NSLayoutConstraint: 使用DHConstraintBuilder: 让我们分解一下: // 1 -greenView和redView在水平轴上之间有15.5像素 -greenView在其超级视图的前导约束上具有默认填充 -redView在其超级视图的尾随约束上具有默认填充 // 2 -blueView在其超级视图的前导约束上具有默认填充 -blueView在其超级视图的尾随约束上具有默认填充 // 3 -greenView在其超级视图的顶部约束上具有默认填充 -greenView在垂直轴上具有与blueView的默认距离 -blueView在其超级视图的底部具有默认填充 // 4 -redView在其超级视图的顶部约束上具有默认填充 -redview在垂直轴上具有与blueView的默认距离 // 5 -greenView和redView具有相等的宽度 // 6 -greenview和blueView的高度相等 我可能有偏见,但是DHConstraintBuilder确实看起来更小,更简洁并且更易于阅读。 它消除了两个常见错误:忘记将translatesAutoResizingMaskIntoConstraints设置为false,以及忘记将视图添加到父视图。 可能突出的一件事是使用 ()|-^ ^-| () 同样,这是Visual Format对 |- -| 不用说,但是此API面向swift3。它必须是swift,才能利用重载的运算符。 DHConstraintBuilder在GitHub上可用,并且为ios 8及更高版本。 这是我的第一个开源项目。 […]

使用IOS动画中的约束…

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

Swift Auto布局示例

这是一个简单的示例,它无需任何代码即可通过Xcode swift3为iOS应用构建简单的个人资料场景,下面的图片是您可以达到的目标。 我们可以看到那些文本字段的前导在同一垂直线上,其他标签也都在同一行,所以我首先确定顶部项目的位置Y 然后,我为这些文本字段和标签设置了主要约束 现在,我设置上下两个拖曳物品之间的距离,但没有设置绝对位置,因为如果有一天我需要移动这些物品,我要做的就是移动最上面的物品,而那些较低的物品将自动跟随移动。 现在让我们转到按钮,我使左按钮以0常数尾随左边距到0常数的conter X处,而右按钮以0常数尾随X到达中心X,并以0常数尾随右边距。 希望这种简单的Xcode自动布局可以帮助刚开始学习快速语言并在简单插入场景中工作的人员,希望大家喜欢它。

UICollectionView具有在iOS 9和10中使用自动布局自动调整单元格大小的功能

警告!!! :使用基本SDK> = iOS 12进行构建时不起作用 在开发iOS应用时。 您通常会遇到一个使用垂直卡片设计的应用程序,如下面的屏幕截图所示。 如果您熟悉iOS Apps开发。 您将知道有2种选择。 使用UITableView或UICollectionView。 在本教程中,我将使用UICollectionView,因为它比UITableView具有更高的可伸缩性,并且您可以在iPad中采用多列。 在WWDC 2016视频会议219:iOS 10中UICollectionView的新增功能。苹果表示,从下面的屏幕快照中收集视图单元格大小有3种方法 在本教程中,我们将使用方法1 自动布局 。 开始吧 首先设置您的视图控制器和UICollectionView。 将您的UICollectionView出口命名为viewController的4面的“ collectionView”引脚约束 由于我们将不会在情节提要中使用集合视图单元格(我们将使用nib代替),因此我们将集合视图中的项目数设置为0,并确保“布局”为“流”,因为我们将使用集合视图流布局来制作单元格自动调整大小。 接下来,创建一个用于收集视图单元格的类及其xib。 在本教程中,我们将其命名为Cell.swift和Cell.xib 别忘了将nib注册为viewDidLoad中的单元。 我们还将UICollectionViewFlowLayout的EstimateItemSize设置为(1,1),因为当设置了估算项的大小时,flowLayout将通过自动布局使用自动调整大小(这是常见的陷阱)。 现在是时候在Cell.xib中设计单元格了,如果您将单元格大小设置为想要的最大宽度(对于5.5英寸的屏幕,> 414则是安全的),如果将宽度设置得太小,应用程序将在运行时崩溃(例如。您将宽度设置为350,它将在5.5英寸的屏幕上崩溃),并为其增加一些高度(请注意,此尺寸仅用于设计时) 将UIView用作容器,以便所有视图将单元格的第4针固定到单元格。 接下来,我们如下设计单元。 确保最底部的视图和最右侧的销钉固定到容器视图。 这是单元自动调整大小所必需的。 然后我们制作单元类的出口 为容器视图宽度创建约束,并为单元格类创建出口 然后设置内容视图宽度约束,以使其与您在情节提要中设置的从笔尖减去集合视图插图中唤醒时的屏幕尺寸匹配。 我们还设置了self.contentView.translatesAutoresizingMaskIntoConstraints = false,以防止Xcode为不需要的单元格的宽度和高度生成自动布局约束。 现在,我们应该像往常一样通过将数据源添加到集合视图中进行测试并运行 示例项目在这里:https://github.com/tttsunny/CollectionViewAutoSizingTest

使用SnapKit编写自动布局约束

当最终使用Auto Layout开发UI时,您可以选择在Interface Builder中布置视图和/或以编程方式编写约束。 两种方法都不总是比另一种更好。 使用IB确实很方便-无需输入所有布局代码,它就可以大大减少开发时间。 但是有些人(包括我本人)经常喜欢用代码编写大多数约束,因为他们发现调整,调试和重用布局更容易。 而且,除非您有明确的流程,否则尝试与故事板文件上的开发人员团队并行工作可能会成为Git Nightmare™。 但是,如果您以编程方式进行了大量布局,也许您已经注意到NSLayoutConstraint的API可能很冗长。 是否曾经在代码中完全实现过复杂的UI? 最终它有多少LOC? 大概很多! 一般来说,代码越少越好吧? 如果有一个更简单,更快的方法来编写布局约束,那将是很好的。 SnapKit简介 从GitHub页面 SnapKit是一种DSL,可在iOS和OS X上简化自动布局。 SnapKit本质上是用于编写约束的语法糖。 它通过UIView / NSView类上公开的’snp’属性提供了很高的抽象水平,允许您使用简洁的闭包语法在视图上定义约束,然后让SnapKit负责其余的工作。 它可以使您的布局代码清晰,简洁。 真的很简洁。 只要看看将UITableView约束到其超级视图的所有四个方面是多么容易。 这是使用原始NSLayoutConstraint API的相同代码。 这是另一个示例,将视图集中在屏幕上。 我们可以利用SnapKit的一些便捷方法和链接约束的能力来略微缩短此时间。 很酷。 如您所见,SnapKit非常直观且易于使用。 查看文档以获取更多示例。 不确定SnapKit是否适合生产中的应用程序,我不确定—好像存在一些内存泄漏问题,也许不是吗? 尽管如此,SnapKit是一个很棒的库,只是因为它变得更好,所以我建议您检查一下。

使UI适应iPhone X时从设备模型中抽象出来

仅使用“自动布局”使按钮具有自定义外观 我们的设计师最近要求在屏幕底部制作一个如下所示的按钮: 在这篇文章中,我将展示如何在不依赖设备模型查找的情况下实现这种自适应UI。 心态 每年,当新设备问世时,人们一直在问如何以编程方式检测模型的问题(2017年也不例外)。 尽管可以这样做,但该API有点奇怪。 这是因为Apple努力教会我们不要这样做。 取而代之的是,他们要求开发人员在进行功能测试时依赖可用性测试,并依靠自动布局来制作自定义界面。 换句话说,抽象远离特定的设备模型。 好吧,在一个可能可行的理想世界中……从这个角度看事物有时确实会有所帮助。 安全区 我要做的第一件事是更改按钮的约束,以遵守主视图控制器视图的安全区域。 这立即解决了我们在iPhone X Simulator和Xcode 9中首次启动该应用程序时遇到的问题。 NSLayoutConstraint * buttonBottomConstraint = nil; 如果(@available(iOS 11,*)){ buttonBottomConstraint = [self.button.bottomAnchor约束EqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor]; } 其他{ buttonBottomConstraint = [self.button.bottomAnchor约束EqualToAnchor:self.bottomLayoutGuide.topAnchor]; } 注意:如果您想知道bottomLayoutGuide.topAnchor ,这是因为bottomLayoutGuide具有id类型。 没有帮助吗? 好吧,这超出了这个故事的范围。 对不起that 然后,我决定重做按钮的所有约束,以坚持安全区域: NSLayoutConstraint * buttonBottomConstraint = nil; NSLayoutConstraint * buttonLeadingConstraint = nil; NSLayoutConstraint * buttonTrailingConstraint = nil; 如果(@available(iOS 11,*)){ […]

安全使用“安全区域布局指南”

从iOS 11开始,不推荐使用顶部和底部布局指南属性,并且Apple引入了安全区域布局指南。 顶部和底部布局指南是在iOS 7中引入的,其主要目的是引导我们将视图与根视图的顶部或底部对齐,以使我们的视图不会被顶部或底部的条遮挡。 顶部和底部布局指南由在UIView上定义的单个属性“ safeAreaLayoutGuide”代替(与UIViewController的顶部和底部布局指南相比)。 它是UILayoutGuide类的实例,这使得它非常易于使用,尤其是与布局锚点一起使用时。 如果您不熟悉UILayoutGuide,可以在我的文章“ UILayoutGuide终极指南”中找到有关它的详细讨论。 或者,如果您从未使用过NSLayoutAnchors,我也会写一篇有关它的文章。 安全区域布局指南 安全区域布局指南提供了一个不会被遮挡的视图区域,您可以将视图与其对齐以实现最大的可视性。 该区域根据顶部和底部条的可用性进行调整。 它是UILayoutGuide的实例,提供了一些属性来绑定视图。 这是有关UILayoutGuide的详尽指南。 与仅在视图控制器中可用的顶部和底部布局指南不同,安全区域布局指南在独立视图中也可用。 使用安全区域布局指南添加约束 在Xcode中: 您可以将视图与安全区域布局指南绑定,就像之前将其与顶部或底部布局指南绑定一样。 以编程方式: 添加安全区域布局指南非常容易。 启用/禁用安全区域布局指南 默认情况下,主故事板的安全区域布局指南已启用。 如果要在Xcode 9中创建新的xib或情节提要,则已经启用了安全区域布局指南选项。 通过进入Interface Builder的文件检查器菜单,然后取消选中“使用安全区域布局指南”选项,可以显式禁用此选项。 在文件检查器菜单中禁用“使用安全区域布局指南”,会将安全区域布局指南附带的约束替换为顶部和底部布局指南,或者如果是视图,则将约束替换为视图的顶部和底部约束。 更改安全区域 您可以重写UIViewController的AdditionalSafeAreaInsets属性来指定自己的安全区域。 更改安全区域也会为子视图也产生新的安全区域。 在上图中,灰色子视图的安全区域发生了变化,并使自身与超级视图的安全区域对齐。 绿色和红色矩形分别显示了我们根视图的安全区域和布局边距指南。 蓝色和黄色矩形代表子视图的安全区域和布局边距。 结论 安全区域布局指南利用了UILayoutGuide API的优势。 它易于在IB或以编程方式实现。 因此,该与我们的老朋友顶部和底部布局指南说再见了。

使用自动布局和情节提要自动调整大小的单元格

介绍 作为iOS开发人员,我习惯于使用layoutSubviews手动编写UI布局。 但是,我花了很多时间在代码中调整自定义表格视图单元的大小,并且不得不手动计算每个标签,图像视图,文本字段以及单元中其他所有元素的高度。 因此,我想找到一个更优雅,更简洁的解决方案。 进行调查后,我将注意力转向了两个老朋友-自动版式和情节提要。 实作 在本文中,我将构建一个非常简单的消息传递应用程序,它的功能仅仅是响应用户发送的内容。 请注意,我将跳过一些无关紧要的步骤,例如,创建视图控制器或自定义表格视图单元格类。 让我们开始使用我们的UI组件。 将表视图,文本字段和发送按钮拖放到情节提要中,然后将它们与视图控制器挂钩。 final class MessagingViewController: UIViewController { @IBOutlet weak var tableView: UITableView! @IBOutlet weak var textField: UITextField! @IBOutlet weak var sendButton: UIButton! // … } 此外,使用情节提要的“ Pin menu设置以下约束: 将表视图的顶部边缘固定在其父视图的顶部边缘0个点处。 将表视图的前缘和后缘固定到其父视图的前缘和后缘0个点。 将文本框底部的边缘固定在距文本字段顶部8个点的位置。 将文本字段的前沿固定在其父视图的前沿距8个点的位置。 将文本字段的尾端固定在距离发送按钮的开头8个点的位置。 将文本字段的底部边缘固定在其超级视图的底部边缘8个点处。 对齐文本字段的顶部和底部边缘以及发送按钮。 完成约束后,移至文本字段的大小检查器,并将“ Horizontal Content Hugging Priority设置为249。设置此优先级应有助于扩展文本字段并修复警告。 其次,将图像视图和标签拖放到表格视图单元格中,并将其与自定义表格视图单元格挂钩。 final class MessagingCell: UITableViewCell { @IBOutlet […]

UIScrollView:如何在代码中使用AutoLayout

在阅读本文之前,但对UIScrollView ,我强烈建议您在UIScrollView上阅读此介绍文章。 PS:自从我在Brian YouTube网站上开设Brian Voong的Youtube课程以来,我已经将自己转换为程序编码员,这意味着我100%的UI员工使用的是代码而不是故事板。 首先第一件事: 最初,事情对我来说看起来很简单,只是: 将UIScrollView添加到主UIView 。 在UIScrollView上添加顶部,左侧,右侧,底部自动布局约束。 将UILabel (显示很多文本)作为子视图添加到刚刚添加的UIScrollView 。 在此新添加的UILabel上添加上,左,右,下AutoLayout约束。 然后,我认为事情应该正常进行。 虽然不是这样。 问题:UIScrollView无法滚动。 原因:尚未正确设置UIScrollView的contentSize。 如何以正确的方式做到这一点: 在现有或新创建的项目中,创建一个新的Swift文件:ScrollViewController.swift 2.在ScrollViewController中,添加所有UI元素将很快使用。 let text =“”“ Lorem ipsum dolor amet,除其他外为adhuc aperiri nam。按商品价格出售commodo melatore ea eam,按商品价格出售commodo meliore ea e。 persius pro,id cum falli accusam。在欧洲有良好的党派,多名成员,在nam。tempor poscent有意向书。 ad eam。per ce lalit vivendum。Ei sit null null aliquam,ferri epicuri quo。ex vim tibique […]

iOS中具有自动布局的可伸缩页眉

伸缩头很酷。 人们熟悉更改框架以实现此目的,例如“设计拆解:可伸缩页眉”。 但是通过自动版式,我们可以使用更好的声明性约束来实现 演示项目为StretchyHeader 我使用SnapKit来明确我们需要哪些约束 scrollView应该将其4个边固定到ViewController ‘s view func setupScrollView(){ scrollView = UIScrollView() scrollView.delegate =自我view.addSubview(scrollView) scrollView.snp_makeConstraints {制造 make.edges.equalTo(view) } } scrollViewContentView必须将其4个边固定到scrollView以帮助确定scrollViewcontentSize scrollViewContentView的高度由其子视图确定。 里面的子视图必须将其top和bottom到scrollViewContentView func setupScrollViewContentView(){ scrollViewContentView = UIView()scrollView.addSubview(scrollViewContentView) scrollViewContentView.snp_makeConstraints { make.edges.equalTo(scrollView) make.width.equalTo(view.snp_width) } } header必须将其顶部固定到scrollView父级,即ViewController ‘s view 阅读title部分,您将看到为了使header伸缩性,必须将其固定在顶部和底部 但是如果我们向上滚动,这些固定的top和bottom约束之间将存在约束冲突 因此,我们必须将headerTopConstraint优先级声明为999,并且headerLessThanTopConstraint func setupHeader(){ 标头= UIImageView() header.image = UIImage(named:“ onepiece”)! scrollViewContentView.addSubview(header) header.snp_makeConstraints { //将header固定到scrollView的父级,现在是ViewController的视图 //当header向上移动时,headerTopConstraint不够,因此将其优先级设为999,并添加另一个小于或等于约束 make.leading.trailing.equalTo(scrollViewContentView) self.headerTopConstraint […]