Ios 我怎样才能解决一个问题;removeConstraint()不工作“;我的UICollectionView有问题吗?
通过编程(没有故事板),我试图删除一组约束,并在设备旋转时创建一组新约束。我用来删除约束的代码执行时不会出错,但实际上不会删除约束。当添加新的(冲突的)约束集时,这将导致布局错误 我使用的是Xcode 10.1和Swift 4.2,没有故事板。在我的MainViewController中,我正在创建并放置一个名为“ticketsView”的UICollectionView,它来自Ios 我怎样才能解决一个问题;removeConstraint()不工作“;我的UICollectionView有问题吗?,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,通过编程(没有故事板),我试图删除一组约束,并在设备旋转时创建一组新约束。我用来删除约束的代码执行时不会出错,但实际上不会删除约束。当添加新的(冲突的)约束集时,这将导致布局错误 我使用的是Xcode 10.1和Swift 4.2,没有故事板。在我的MainViewController中,我正在创建并放置一个名为“ticketsView”的UICollectionView,它来自viewDidLoad()调用的函数。在addChild()和addSubview()之后,我调用一个名为applyt
viewDidLoad()
调用的函数。在addChild()
和addSubview()
之后,我调用一个名为applyticketsviewsconstraints()
的函数,该函数确定设备的当前方向,然后(预期)移除任何现有约束并为当前设备方向应用适当的约束集
我重写viewWillTransition:toSize:withCoordinator()
,每当设备旋转时,它都会从coordinator闭包中调用相同的applyTicketsViewConstraints()
函数
在应用程序启动时,将根据初始设备方向正确应用约束。第一次将设备旋转90度时,显示器也会成功更改,但此后的任何旋转都会导致“[LayoutConstraints]无法同时满足约束”错误消息
我曾尝试循环遍历现有的ticketsView约束,一次删除一个约束,并尝试一次性删除所有约束,但这两种方法都无法实际删除约束。它们似乎都成功运行,但约束在完成后仍然存在
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()
}
我希望我在上面代码中创建的4个约束将被删除,以便我可以用不同的值重新创建它们。我似乎找不到一种方法来移除它们(这很有效)。上面代码中注释掉的两行代码表明我也尝试过它们(未成功)。您可以尝试
var portrait = [NSLayoutConstraint]()
var landscape = [NSLayoutConstraint]()
let porCon1 = ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width)
let porCon2 = ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 )
let porCon3 = ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0)
let porCon4 = ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.75)
portrait = [porCon1,porCon2,porCon3,porCon4]
let landCon1 = ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width)
let landCon1 = ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 )
let landCon1 = ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0)
let landCon1 = ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.65)
landscape = [landCon1,landCon2,landCo3,landCon4]
也可能是
NSLayoutConstraint.deActivate(portrait)
NSLayoutConstraint.deActivate(landscape)
if por {
NSLayoutConstraint.activate(portrait)
}
else {
NSLayoutConstraint.activate(landscape)
}
你可以试试
var portrait = [NSLayoutConstraint]()
var landscape = [NSLayoutConstraint]()
let porCon1 = ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width)
let porCon2 = ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 )
let porCon3 = ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0)
let porCon4 = ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.75)
portrait = [porCon1,porCon2,porCon3,porCon4]
let landCon1 = ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width)
let landCon1 = ticketsView.trailingAnchor.constraint(equalTo:safe.trailingAnchor, constant: 0 )
let landCon1 = ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0)
let landCon1 = ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.65)
landscape = [landCon1,landCon2,landCo3,landCon4]
也可能是
NSLayoutConstraint.deActivate(portrait)
NSLayoutConstraint.deActivate(landscape)
if por {
NSLayoutConstraint.activate(portrait)
}
else {
NSLayoutConstraint.activate(landscape)
}
我认为您必须使用激活/停用约束,例如: 为它们创建变量,并在SetupConstraintsMethod中设置约束值。 var notRotatedYConstraint:NSLayoutConstraint
var rotatedYConstraint: NSLayoutConstraint!
在viewdidload中:
NSLayoutConstraint.activate([notRotatedYConstraint])
在iPhone旋转时的函数中。
NSLayoutConstraint.deactivate([notRotatedYConstraint])
NSLayoutConstraint.activate([rotatedYConstraint])我认为您必须使用激活/停用约束,例如: 为它们创建变量,并在SetupConstraintsMethod中设置约束值。 var notRotatedYConstraint:NSLayoutConstraint
var rotatedYConstraint: NSLayoutConstraint!
在viewdidload中:
NSLayoutConstraint.activate([notRotatedYConstraint])
在iPhone旋转时的函数中。
NSLayoutConstraint.deactivate([notRotatedYConstraint])
NSLayoutConstraint.激活([rotatedYConstraint])发布的前两个答案组合起来,为我提供所需的答案@Sh_Khan指示我使用NSLayoutConstraint数组@Wurzel指出,我应该使用NSLayoutConstraint.activate()和.deactivate()函数一次启用/禁用整个约束组 所以,关键是将所有纵向约束添加到一个数组,将所有横向约束添加到另一个数组,然后每次方向改变时,我都会在两个数组上调用deactivate函数,然后重新创建并激活相应的数组 (当设备方向改变时,SafeArealLayoutGuide会改变,这就是为什么我无法事先预先创建两组约束。我还希望找到一个解决方案,如果约束变得更动态,该解决方案将起作用-例如响应用户调整显示区域的大小) 我的原始代码现在变成:
func applyTicketsViewConstraints() {
let safe = self.view.safeAreaLayoutGuide
let deviceSize = UIScreen.main.bounds.size
NSLayoutConstraint.deactivate(portraitTicketsViewConstraints)
NSLayoutConstraint.deactivate(landscapeTicketsViewConstraints)
if deviceSize.width < deviceSize.height {
print("TicketsView Constraint: Device Size is in PORTRAIT orientation!")
portraitTicketsViewConstraints = [
ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width),
ticketsView.trailingAnchor.constraint(equalTo: safe.trailingAnchor, constant: 0 ),
ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0),
ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.75)
]
NSLayoutConstraint.activate(portraitTicketsViewConstraints)
} else {
print("TicketsView Constraint: Device Size is in LANDSCAPE orientation!")
landscapeTicketsViewConstraints = [
ticketsView.leadingAnchor.constraint(equalTo: safe.trailingAnchor, constant: -safe.layoutFrame.width),
ticketsView.trailingAnchor.constraint(equalTo: safe.trailingAnchor, constant: 0 ),
ticketsView.bottomAnchor.constraint(equalTo: safe.bottomAnchor, constant: 0),
ticketsView.heightAnchor.constraint(equalToConstant: safe.layoutFrame.height * 0.65)
]
NSLayoutConstraint.activate(landscapeTicketsViewConstraints)
}
ticketsView.layoutIfNeeded()
}
}
func applyTicketsViewConstraints(){
let safe=self.view.safeArea布局指南
让deviceSize=UIScreen.main.bounds.size
NSLayoutConstraint.deactivate(肖像票证视图约束)
NSLayoutConstraint.deactivate(landscapeTicketsViewConstraints)
如果deviceSize.width
发布的前两个答案结合在一起,为我提供了所需的答案@施胡汗