Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我怎样才能解决一个问题;removeConstraint()不工作“;我的UICollectionView有问题吗?_Ios_Swift_Nslayoutconstraint - Fatal编程技术网

Ios 我怎样才能解决一个问题;removeConstraint()不工作“;我的UICollectionView有问题吗?

Ios 我怎样才能解决一个问题;removeConstraint()不工作“;我的UICollectionView有问题吗?,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,通过编程(没有故事板),我试图删除一组约束,并在设备旋转时创建一组新约束。我用来删除约束的代码执行时不会出错,但实际上不会删除约束。当添加新的(冲突的)约束集时,这将导致布局错误 我使用的是Xcode 10.1和Swift 4.2,没有故事板。在我的MainViewController中,我正在创建并放置一个名为“ticketsView”的UICollectionView,它来自viewDidLoad()调用的函数。在addChild()和addSubview()之后,我调用一个名为applyt

通过编程(没有故事板),我试图删除一组约束,并在设备旋转时创建一组新约束。我用来删除约束的代码执行时不会出错,但实际上不会删除约束。当添加新的(冲突的)约束集时,这将导致布局错误

我使用的是Xcode 10.1和Swift 4.2,没有故事板。在我的MainViewController中,我正在创建并放置一个名为“ticketsView”的UICollectionView,它来自
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
发布的前两个答案结合在一起,为我提供了所需的答案@施胡汗