【发布时间】:2019-04-07 17:39:43
【问题描述】:
以编程方式(没有情节提要),我试图删除一组约束并在设备旋转时创建一个新集。我用来删除约束的代码执行没有错误,但实际上并没有删除约束。这会在添加新的(冲突的)约束集时导致布局错误。
我正在使用没有情节提要的 Xcode 10.1 和 Swift 4.2。在我的 MainViewController 中,我从viewDidLoad() 调用的函数中创建并放置了一个名为“ticketsView”的 UICollectionView。在addChild() 和addSubview() 之后,我调用了一个名为applyTicketsViewConstraints() 的函数,它确定设备的当前方向,然后(预计)删除任何现有约束并为当前设备方向应用适当的一组约束。
每当设备旋转时,我都会覆盖 viewWillTransition:toSize:withCoordinator(),它会从协调器闭包中调用相同的 applyTicketsViewConstraints() 函数。
在应用启动时,会根据初始设备方向正确应用约束。设备第一次旋转 90 度时,显示也成功更改,但之后的任何旋转都会导致“[LayoutConstraints] 无法同时满足约束”错误消息。
我尝试循环遍历现有的 ticketView 约束并一次删除它们,并且我尝试一次将它们全部删除 - 但两种方法都不会导致实际删除约束。它们似乎都运行成功,但完成后约束仍然存在。
func createTicketCollectionWindow() {
ticketsLayout = UICollectionViewFlowLayout()
ticketsVC = TicketCollectionController(collectionViewLayout: ticketsLayout)
ticketsVC?.collectionView?.backgroundColor = UIColor.darkGray
ticketsView = ticketsVC!.view
ticketsView.translatesAutoresizingMaskIntoConstraints = false
addChild(ticketsVC!)
self.view.addSubview(ticketsView)
applyTicketsViewConstraints()
}
func applyTicketsViewConstraints() {
let safe = self.view.safeAreaLayoutGuide
let deviceSize = UIScreen.main.bounds.size
for individualConstraint in ticketsView.constraints {
print("TicketViewConstraints: Removing Constraint: \(individualConstraint)" )
// ticketsView.removeConstraint(individualConstraint)
}
ticketsView.removeConstraints(ticketsView.constraints)
// self.view.removeConstraints(ticketsView.constraints)
if deviceSize.width < deviceSize.height {
print("TicketsView Constraint: Device is in PORTRAIT orientation!")
ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width).isActive = true
ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 ).isActive = true
ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0).isActive = true
ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.75).isActive = true
} else {
print("TicketsView Constraint: Device is in LANDSCAPE orientation!")
ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width).isActive = true
ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 ).isActive = true
ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0).isActive = true
ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.65).isActive = true
}
ticketsView.layoutIfNeeded()
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { (_) in
self.applyTicketsViewConstraints()
self.ticketsVC?.collectionView.reloadData()
}) { (_) in
self.ticketsView.layoutIfNeeded()
}
}
我希望我在上面的代码中创建的 4 个约束将被删除,以便我可以使用不同的值重新创建它们。我似乎找不到删除它们的方法(有效)。上面代码中注释掉的上面两行表明我也尝试过(不成功)。
【问题讨论】:
标签: ios swift nslayoutconstraint