ios - 使用 NSLayoutAnchor 不好吗?

标签 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

最佳答案

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


  • 在 View Controller 上显示UIViewUIButtonUILabel...等普通 View 时,您可以使用自动布局。使用框架和自动布局之间的区别是微不足道的。
  • 对于 UICollectionViewCellUITableViewCell,您应该使用框架。在这种情况下,框架和自动布局之间的性能存在很大差异。

让我们看看下面的基准来比较它们。

图取自LayoutFrameworkBenchmark .它显示了布局 100 个 UICollectionView 单元格时的性能

enter image description here

如您所见,自动布局比手动布局和非自动布局花费更多时间(约 15 倍)。差异会影响您的 Collection View 在滚动时的平滑度。

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


结论:

  • UICollectionViewCellUITableViewCell 上使用自动布局时要小心。如果您的 Collection View 或表格 View 在滚动时不流畅,自动布局可能是一个重要原因。

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

关于ios - 使用 NSLayoutAnchor 不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52268035/

相关文章:

ios - 添加约束时出错

ios - 无法同时满足约束,将尝试通过打破约束来恢复

ios - 我可以使用 Apple 的推送通知服务发送图像吗?

javascript - 如何在plugin.xml中添加同名不同文件夹的资源?

ios - 在 Swift 中使用协议(protocol)作为类型时出错

ios - 无法快速符合 objective-c 协议(protocol)

Swift:动画 uilayoutconstraints 和更改 alpha 会导致崩溃

iOS-viewDidAppear : delayed when showing a UITableView

ios - 使用PrepareForSegue方法从一个UITableView传递到另一个UITableView

xcode - Swift 单元测试和 "build for testing"错误