Tag: 版图

可视化扩展布局

我注意到许多在线用户(即StackOverflow)在视图布局不正确时会跳到少数UIViewController属性,然后几乎随机地操作它们以获得所需的行为。 这总是导致对布局问题的“可接受”答案是“自动将AdjutstsScrollViewInsets设置为[true / false]”或“将edgesForExtendedLayout设置为UIRectEdgeZero”,其中一个人说“谢谢,已修复!”,另外五个人说“那没错”。修复它会有所帮助”。 即使在Apple的WWDC视频中,也没有关于这些API的工作原理以及它们相互之间有什么影响的超级清晰的解释,尽管WWDC 2013在发布时有广泛的概述。 我找不到关于其所有工作原理的出色文章,所以我想针对这些API的工作原理发布PSA,以便我们可以开始以正确的方式修复问题并停止永久保存不良信息。 我认为具有交互属性的示例应用程序绝对是了解UIKit来龙去脉的最佳方法。 如果你玩的够多的话,你就可以开始预测行为。 一旦您可以解释更改给定属性将对结果布局产生什么影响,便有了相当不错的掌握。 因此,为了说明这一切是如何工作的,我将包括一个示例应用程序的屏幕截图,然后为您提供一个停顿的地方,并思考改变给定属性的效果。 当然,您可以浏览一下,但是我想您会发现尝试提前计算出最终的布局会更有优势。 为此,我们将从iOS 10开始,它使我们可以忽略新引入的safeArea及其带来的其他API(和注意事项)的影响。 我们将在不久的将来覆盖这些内容。 这是所有具有实例化时视图/视图控制器具有的默认值以及在UINavigationController内部显示tableView时的默认外观的所有内容。 请注意,tableView的背景为绿色,但单元格背景为红色。 我们可以使用它来查看tableView的开始位置及其内容的开始位置; 当这两个不同时,我们正在查看一个非零contentInset,它显示在底部的单元格中。 这个contentInset来自哪里? 如果您检查代码,我们不会自己指定。 自动输入AdjustsScrollViewInsets 。 UIViewController属性autoAdjustsScrollViewInsets是iOS 7(对界面进行了大修的版本)中引入的,默认为true。 在iOS 7中,导航栏默认为半透明,并且为了展示半透明性,视图必须在导航栏下方开始(如果没有内容可看,您将无法欣赏半透明!)。 但是,如果视图从导航栏后面开始,则很明显,如果没有一些Apple Magic™来为开发人员处理事情,事情就会变得模糊。 这种魔术以automaticAdjustsScrollViewInsets的形式出现,它进入UIViewController的子视图并运行此测试: func magicView()-> UIView? { 保护self.isKind(of:UIScrollView.self)else { 返回self.subviews.first?.shouldApplyMagic() } 返回自我 } 并自动设置该滚动视图的contentInset以容纳navigationBar。 ContentInsets是非常基本的,我仅将这一部分包括在内,以快速提醒那些尚不清楚的人。 我发现,如果您将UIScrollViews视为内容的“窗口”,则更容易理解它们在做什么; 窗口框架本身不会改变大小,但是您可以四处走动以查看窗口框架后面的其他内容。 您所看到的不止是那里,所以一旦您触及内容的最上/最下部分,就无法再进行任何操作(忽略弹跳的UIKit给我们提供的内容)。 使用相同的隐喻,contentInset本质上将“空白”内容添加到您正在查看的内容上方,这意味着您可以看到比其他地方更多的内容。 如果我将topContentInset添加为100点,则意味着我可以滚动到内容的顶部,然后再在其上方滚动100点。 对于UITableView的基本情况,这只是空白,它将显示您的backgroundColor是什么,但是UIScrollViews可以让您做更多的事情。 我现在不会讲这个; 也许解释UIScrollViews是另一天的好主意。 既然我们对automaticAdjustsScrollViewInsets有了一个不错的了解,那么应用程序的初始状态就应该有意义。 我们的视图从UINavigationController的顶部开始(当然,它的视图)。 默认情况下,Apple会自动为我们提供AdjustsScrollViewInsets == true,因此,在布局视图时,它会看到导航栏的高度为64(进入状态栏区域),并在tableView上方为我们提供了64个空白内容。 […]

自动布局:朋友还是敌人?

首先是第一件事。 根据Apple的自动版面配置: 根据放置在视图上的约束,动态计算视图层次结构中所有视图的大小和位置。 例如,您可以限制按钮的位置,使其在“图像”视图中水平居中,并且按钮的顶部边缘始终保持在图像底部下方8个点。 如果图像视图的大小或位置发生更改,则按钮的位置会自动调整以匹配。 这种基于约束的设计方法使您可以构建可动态响应内部和外部更改的用户界面。 这是一个非常强大的工具,当有人完全理解它时,这几乎是魔术。 如此说来,下面列出的是我多年来发现的一些优点。 它可以帮助新开发人员 2年前,作为新开发人员,我不得不学习Swift,如何正确编写语言以及诸如扩展,闭包之类的许多其他内容。 我不想花更多的时间来编写UI,所以我了解了自动布局的工作原理。 我了解到,如果新开发人员能够很好地理解该技术,则可以节省大量开发时间。 简单的布局和适应性 当涉及到简单的布局和应用程序的适应性时,“自动布局”是一个很好的工具。 特别是对于Xcode 8,界面构建器背后的团队在改善它方面做得非常出色。 确实很棒,并且具有一些很棒的功能(接口构建器的提示和技巧将在第二部分中介绍,请继续关注) “自动布局”比编写UI更快 在iOS开发中创建用户界面的方法不是对是错。 对于许多用户而言,“自动版式”的工作原理比另一种更好且更快。 我就是其中之一。 我认为使用自动布局比通过编程设置约束要快。 先进的技术 信不信由你,Auto Layout是一项先进的技术,Apple付出了大量的努力来改进它并使其变得更好。 通过每次Xcode更新,我发现Interface Builder团队所做的更新确实执行得很好。 有用的结论 作为开发人员,在Xcode上设计UI时不要只放弃/使用一种方法。 两种方法都有其优点和缺点。 拥抱他们两个。 如果您是Auto Layout的新手,则WWDC讲座是了解其工作原理并了解一些有用的见解的良好起点。 更具体地说,当我开始尝试“自动布局”时,WWDC对我来说是如此。

iOS:自动版式,内在内容大小,内容拥抱优先级,内容压缩抵抗优先级

1.本质内容大小: 在设定UILabel的自动版面时,我们只需给定对应superView的Leading and top,不需给定宽与高,就​​可以决定UILabel的位置。原因就是内在内容大小的关系,内在内容大小计算了UILabel内在文字的CGRect决定了本身的宽与高的值。 2.内容拥抱优先级: 解释:抗拉伸优先级,优先权超过越不会延展展开来 例如:左边ID标签跟右边邮件标签,期望在其中一个标签过长时不要互相交叠到,并且他们之间的距离为20 pt。但在设定约束条件的过程中我们发现这样是不可行的,原因为不知道要让那一个UILabel的宽度拉长(如果没有一个Label被拉长,他们之前不可能为20pt)。 上图为对电子邮件标签的内容拥抱水平优先级进行调整,使用邮件标签的优先权> ID标签。通过这样的设置后可以使电子邮件标签不被延展被延展,换句话说优先权越低越会被延展来。 3.内容压缩抗性优先级: 解释:抗压缩优先权,优先权较高越不容易被压缩 延续标题2的设定,如果此时ID标签过长又会出现约束错误,原因是遵循内在内容大小我们可以知道个别的UILabel宽度为多少,但是这样的设定UILabel之间的距离就不可能为20(假设萤幕宽度为375,ID标签宽度300,Mail标签宽度150)。 如果我们希望ID标签不要被压缩到内容压缩阻力优先级水平的优先权就要继承,反之亦然。

将UITextView嵌入UITableViewCell中

在Workable,我们有一个称为评估的功能。 部分原因是可以填写面试套件,如下所示。 当我们开始研究如何实现此功能时,出现的一个想法是使用堆栈视图,但是用户创建了采访工具包,因此它们的大小可能会有所不同。 因此,我们选择使用UITableView作为此屏幕的主干。 毕竟它只是UITableViewCell中的UITextView,对吗? 在本文中,我将尝试列出我们面临的所有问题以及如何解决这些问题。 在演练结束时,将附上完整的解决方案。 在单元格内添加UITextView 我们创建了一个原型单元,并添加了UITextView,如下所示。 另外,不要忘记在UITextView的属性检查器中关闭 Scrolling Enabled属性。 这使UITextView具有取决于文本的固有内容大小,或者接近于我们稍后发现的文本大小。 现在,我们希望能够编辑文本。 简单,只需启用UITextView的`Editable`属性即可。 但是我们有一个小问题,我们希望UITableViewCell跟随UITextView的高度。 我们可以从单元格创建一个回调,以通知我们任何文本更改,如下所示: 在TextTableViewCell.swift中 @IBOutlet弱var textView:UITextView! var textChanged:(((String)-> Void)? 覆盖func awakeFromNib(){ super.awakeFromNib() textView.delegate =自我 } func textChanged(action:@escaping(String)-> Void){ self.textChanged =操作 } func textViewDidChange(_ textView:UITextView){ textChanged?(textView.text) } 在TableTableViewController.swift-> cellForRow中 cell.textChanged {[weak tableView](newText:String)在 } 注意:不要忘了在此闭包的捕获列表中使tableView变弱,因为您将得到一个保留周期。 tableView->单元格(UI),单元格-> tableView(关闭) 我们唯一要做的就是重新加载单元。 我们有多种方法可以做到这一点,因此我们将尝试最常见的一种方法tableView.reloadData()。 cell.textChanged {[weak tableView](_)in //可能的解决方案:1 […]

自定义表格单元格iOS开发。 – Akhil Koothal

自定义表格单元格iOS开发。 自定义表格单元格是最常用的视图之一,可能在每个应用程序中都可以找到,这里是一些需要注意的基本内容并按照说明进行操作。我将使用已定制表格的现有汽车应用程序完成该项目细胞。 创建一个单元.xib文件 设置单元格的约束 设置该单元格的属性标签 在TableView中显示数据 创建具有任何自定义名称的项目。在视图控制器中,添加TableView并为所有视图设置约束“ 0”。即使您已嵌入导航栏,也将约束设置为“ 0”。 创建一个具有自定义名称的TableViewCell和一个单元格.xib文件。首先将一个UIView保留在单元格中,然后使用此视图作为参考,将所有约束设置为“ 0”,以定义标签。UIView用灰色定义颜色易于理解。在视图中,我有一个汽车图像,汽车名称,汽车里程,成本,所在区域。提及了“ carsDataCell”单元格的标识符。 现在为表视图单元设置了约束,我们必须将所有标签和图像属性拖放到表视图单元文件上。 为此创建一个通用函数,这样您就不会忘记标签。标签中有图像,资产中有静态图像。 首先在视图中加载,然后将委托和数据源设置为self。同时添加UITableViewDelegate和UITableViewDataSource协议。在视图中注册创建的单元格后,请确保正确指定名称。 函数CellForRowAt有一个用cellIdentified定义的单元格,并提到了CellName(CarsTableCell)。然后您可以调用在该单元格中声明的函数。 函数numberOfRowInSection具有定义的行,这些行指定为carsName或carsArea的计数。 定义TableCell的高度,并确保您还为单元格.xib文件中的单元格指定了相同的高度。 这就是今天的美好时光!!

以编程方式介绍自动版式

本教程来自 codzify.com将在iOS App开发中以编程方式为您提供有关Autolayout的充分理解。 希望你们都喜欢! 您可以了解更多iOS App开发概念 这里。 UIView Autolayout是iOS App开发中一个非常有趣的概念。 自动布局负责响应式设计。 iPhone每次都有不同的屏幕尺寸。 借助Autolayouts ,您不必每次都创建应用程序设计。 自动版式负责响应式设计。 我将提供一个简单的库,您可以免费将其用于Autolayouts。 请参见给定示例中的自动版式代码,它太长了。 因此,我们在下一个教程中简化了代码。 但是,要了解此类别,您必须清除约束的基本概念。 什么是自动布局约束? 注意:-要使用自动版式,您必须定义约束。 约束是您应分配给特定视图(如…)的特定规则。 1)无论iPhone屏幕尺寸为,请向左间隔20px。 2)无论iPhone屏幕尺寸是多少,都请向右间隔20px。 3)无论iPhone屏幕尺寸是多少,请给其顶部20px的间距。 4)无论iPhone屏幕尺寸是多少,都应与底部隔开20px的间距。 这意味着在一个视图中,距左,右,底部和顶部的间距为20 px。 编写约束的语法: 让topConstraint = NSLayoutConstraint(item: SpecificUIView ,attribute: .attributeName ,relatedBy: .Realtion ,toItem: superView ,attribute: .attribute ,乘数:1,常数: 12 ); [superView addConstraint:contraint]; 总记得 , 假设将label1添加到view1,则view1(orangeColor View)将成为label1的超级视图。 2)假设将view1添加到boxView,则boxView将成为view1的超级视图。 3)假设将boxView添加到superBoxView,则superBoxView将成为boxView的超级视图 约束属性最常用的包括: 1)NSLayoutConstraint.left 2)NSLayoutConstraint.right […]

堆栈视图—拥抱抗压优先Kullanımı

Merhaba ,Buyazıda的抗压性ve拥抱优先konusunu elealıyoruz。 Tümcihazlarda tekilgörünümüyaratmaksöylendiğikadar zor mu? Cevabıbirlikte inceledikten sonra siz verin。 哈迪(Hadi)Başlayalım。 堆栈视图Nedir? 自动布局可从StackView iOS 9到hayatımızagirdi。 在属性中查看以下内容:在属性中查看以下内容: Yatay Veya dikey olarak hizalamayapmanızısağlar: Axis durumunagöreaşağıdakişekillerdehizalamayapmanızısağlar; Axis Vertical durumu图标:领导,培训,填充中心 轴水平durumu图标:顶部,底部,填充中心 Aşağıdakikurallarıbelirleyerek boyutdağılımınıyapmanızısağlar: 填充: Yeni bir UIStackViewoluşturulduğundavarsayılandağıtımtürüolarak belirlenir。 Benim测试,用户界面UITextField和UIImageViewkullandımvebunlarıyatay bir UIStackViewgörünümündegruplandırıyorum。 Kontrollerinizi,分布ı填充olarak ayarlanan bir UIStackViewiçerisineyerleştirdiğinizde,kontrollerintümünüdoğalboyutlarındatutacak vealanıdoldurmakiçinbunlardan biriniuzatacaktır。 内容共享优先(CHP)内容共享优先(CHP)内容共享优先。 UITextField’larıarasınasekiz birimboşlukekledim,她的birinin boyutunugörebilirsiniz。 TümkontrollerinizaynıCHP’ye sahip ise Xcode,düzeninbelirsizolduğunuşikayeteder。 Düzeltebilmekiçinstackviewiçerisindekiobjelerinboyutlarıbelliolmalıveyaekranınboyutunun yetersizkalmasıdurumundaönceliğinkimdeolduğubelirtilmelidir。 […]

内容物拥抱和内容物抗压缩性

自动布局使用约束的优先级来解决两个不同约束之间的冲突。 对于具有固有大小的视图,自动布局使用内容拥抱和内容压缩抵抗来解决冲突。 让我们考虑一个例子。 假设我们有一个固定的高度视图,其中有两个标签作为子视图,如下所示。 它可以是标题和内容标签。 标签具有固定的顶部和底部间距,并具有最高优先级。 观察下图,标签内容恰好适合可用空间。 标签的内在内容大小等于可用空间。 内容拥抱 让我们考虑另一个例子。 两个标签都有一行内容。 现在,标签必须超出其固有大小,才能满足标签的约束并适合视图内部。 自动布局是一个冲突。 它必须展开其中一个标签,但无法确定。 因此,它使用内容包含优先级来解决冲突并扩展其中之一。 我为第一个标签指定了最高的内容优先级,以防止其增长。 具有最低优先级的第二个标签会超出其固有内容大小,以容纳剩余空间。 内容拥抱优先级可以设置如下 titleLabel.setContentHuggingPriority(.defaultHigh,for:.vertical) subTitleLabel.setContentHuggingPriority(.defaultLow,for:.vertical) 也可以在情节提要中设置 耐含量压缩 考虑另一个示例,其中两个标签的内容都较大。 现在两个标签都无法在可用空间中显示完整的内容,它不得不缩小其中一个标签,但无法确定它。 自动布局是一个冲突。 因此,它使用内容压缩抵抗来解决冲突并缩小其中之一。 如果需要,我希望标题标签显示完整的文本,而内容标签缩小。 为标题标签设置更高的抗压缩性可防止其收缩。 耐内容压缩性可以如下设置 titleLabel.setContentCompressionResistancePriority(.defaultHigh,for:.vertical) subTitleLabel.setContentCompressionResistancePriority(.defaultLow,for:.vertical) 也可以在情节提要中设置它 今天就这些。 通过https://twitter.com/ideekshi与我联系

iOS-内容拥抱和内容压缩抵抗优先级

在处理自动布局时,优先级非常重要。 每个约束都有一个优先级。 它只是一个介于0到1000之间的数字。 根据apple docs: 布局优先级用于向基于约束的布局系统指示哪些约束更为重要,从而在满足系统整体约束时允许系统进行适当的权衡。 只有当两个不同的约束发生冲突时,优先权才真正发挥作用。 该系统将重视具有较高优先级的系统。 因此, 优先级是自动布局世界中的决胜局 。 内容包含优先级: 设置优先于使视图大于其固有大小的优先级。 将此优先级设置为更大的值表示我们不希望视图的大小超过其内容的大小。 考虑上述情况,其中两个视图水平放置,没有适当的宽度限制。 这将产生冲突。 在这种情况下,我们需要将一个视图的内容包含优先级设置为大于另一个视图的优先级。 考虑这个图像。 将两个标签放到视图上,并且对两个标签的顶部尾部和前部侧都施加了约束。 没有给出这两个标签的宽度,这在这两个标签之间产生了冲突。 在这里,两个标签的水平内容的优先级均等于251。正如我之前提到的,一个视图的优先级约束应高于另一个视图,以打破平局。 让我们将包含绿色标签优先级的水平内容设置为250,让蓝色标签优先级保持不变。 在这种情况下,如前所述,具有较高水平内容优先级的一个视图将不会超出其内容大小。 这意味着绿色标签将增长,蓝色标签将保持其固有内容大小。 同样,如果绿色的值较高,则意味着蓝色标签将超出其固有内容大小。 因此,具有较高优先级的内容,绑定的视图将更紧密地拥抱于内在内容,从而阻止视图超过其内在内容的大小。 内容压缩抗性优先级: 设置视图拒绝使其小于其固有大小的优先级。 设置较高的值意味着我们不希望视图缩小到小于内部内容大小。 内容压缩抗性非常简单。 没有太多的并发症。 优先级越高,表示收缩的阻力越大。 这是一个示例:考虑一个名称很长的按钮: 假设名称为“ 具有较大名称的按钮 ”。 我们添加了一个简单的约束,告诉自动布局尝试将按钮的宽度保持在44点。 Auto Layout会按照提示进行操作,并且折叠我们的按钮,使其完全不可读。 不用担心,我们可以使用抗压缩性来阻止这种情况。 将按钮的水平压缩阻力优先级设置为1000。现在,将宽度约束的优先级更改为0到999之间的任何值。 小于按钮的水平“压缩阻力优先级”。 现在,“自动布局”允许按钮的固有内容大小优先于宽度约束: 而已。 ! 请享用!! 如果您喜欢阅读这篇文章,请分享并给予一些鼓掌,以便其他人可以找到它👏👏👏👏👏!!!! 您可以在Medium上关注我以获取新文章。 另外,在LinkedIn上与我联系。 如果您有任何评论,问题或建议,请随时在下面的评论部分中发布它们!

IOS中的自动布局

自动布局是基于约束的布局系统。 它允许开发人员创建一个自适应UI,以对屏幕尺寸和设备方向的变化做出适当的响应。 在Interface-Builder中,我们使用Pins,Aligns,Resolvers和Stack…,它们位于屏幕底部的源代码编辑器下方。 堆 对齐 销 解析器 销钉-→选择场景中的一个对象,然后描述离它最近的邻居对象有多远。 您可以在图钉按钮上找到所有图钉约束。在提供约束时,您可以从下拉菜单中更改相对视图。 对齐—→选择两个视图/对象并设置它们之间的关系。 通常对齐到公共边缘或中心 解析器—→如果我们不立即更新框架,则可以在解析器中更新它们。 这两个部分看起来相似,但顶部仅适用于选定的视图,底部适用于所有视图。 堆栈—将视图嵌入堆栈视图。 自Xcode 7以来,堆栈视图是一项新功能。 约束错误 所有约束错误均以警告开头,但在运行时它们将成为致命错误。 我们必须解决这些错误,然后再致死。 3种错误 → 错放的视图 具有正确的约束条件,但在运行时位置不正确。 如果选中该选项,则会显示绿色虚线/矩形,以显示正确的位置。这些线上的数字显示正确位置的距离/距离。要解决此问题,请使用“ Pin&Align”菜单中的“ Update Frames”。 2.缺少约束和 也称为“模糊约束”。 所有视图都需要足够的信息来确定视图的位置和大小。 如果缺少约束,则框架颜色将变为“红色”。要解决此问题,请在特定视图中添加“缺少约束”。 3.冲突约束 这是最困难的:约束太多。 显示为红色。 解决方法:删除约束,直到仅剩一个约束为止。