使用NSLayoutAnchor是否不好?

时间:2018-09-11 02:54:12

标签: ios swift nslayoutconstraint nslayoutanchor

我通常使用NSLayoutAnchor,但很多时候建议不要使用它。除了更复杂/更长的代码外,它是否还存在诸如性能下降之类的问题?

有人告诉我使用:

let myView = UIView(frame: CGRect(x: 0, y: 20, width: view.frame.bounds.width, height: 100))

代替:

let myView = UIView()
myView.translatesAutoresizingMaskIntoConstraints = false
myView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
myView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
myView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
myView.heightAnchor.constraint(equalToConstant: 100).isActive = true

3 个答案:

答案 0 :(得分:2)

使用框架缺点是,一旦将它们布置好,就需要在需要时相对于某些东西进行手动更改。例如:方向更改,动画等。但是,如果使用 autolayout ,则将相对定义视图的位置,这意味着,即使在方向更改或动画的情况下,视图也将自动调整其大小根据您设置的约束条件。

关于性能下降,自动布局需要花费更多时间(而不是那么多)来计算视图的框架,但这可以忽略不计,而便捷的方式则掩盖了性能影响。

最后,考虑到大多数视图将需要基于屏幕大小,方向变化等进行某种动态定位的事实,因此框架的用例将非常小。混合框架和自动布局永远不会好主意。


Tl; dr-自动布局>框架。

答案 1 :(得分:1)

首先,我想确认使用框架比自动布局要快得多(据我所知约为10倍)。这就是为什么另一个人告诉您使用框架而不是自动布局的原因。 @RakeshaShastri有一个很好的答案来解释为什么我们应该使用自动布局,但是我的答案将讨论何时应该使用框架而不是自动布局。


  • 在视图控制器上显示普通视图(例如UIViewUIButtonUILabel ...)时,可以使用自动布局。使用框架和自动布局之间的区别很小。
  • 对于UICollectionViewCellUITableViewCell,应使用框架。在这种情况下,框架和自动布局之间的性能差异很大。

让我们看一下下面的基准进行比较。

图片是从LayoutFrameworkBenchmark拍摄的。它显示了在布局100个UICollectionView单元格时的性能

enter image description here

如您所见,自动布局比“手动布局”和“非自动布局”花费的时间要多得多(约15倍)。差异将影响您的收藏夹视图在滚动时的平滑程度。

特别是当您的单元格具有沉重的视图层次结构时,自动布局将花费大量时间根据多余的计算约束来计算单元格子视图的位置。滚动时可以使集合视图或表视图滞后。在这里使用frame可以尽可能减少多余的计算,并帮助我们节省其他任务的时间。


结论:

  • UICollectionViewCellUITableViewCell上使用自动布局时要小心。如果滚动时收藏视图或表格视图不平滑,则可能是自动布局的一个重要原因。

  • 仅在遇到自动布局问题时才使用框架。在正常情况下使用框架可获得的性能微不足道。

答案 2 :(得分:1)

如果您担心复杂/冗长的代码,请尝试SnapKit。它使您喜欢自动布局https://github.com/SnapKit/SnapKit

话虽如此,很多人倾向于考虑AutoLayout VS Frame。但实际上,您应该同时使用两者。如果视图不会改变并且需要快速交互,请使用“框架”。如果您希望视图可缩放并处理横向/纵向,请使用“自动布局”。