gpt4 book ai didi

ios - 第二次加载 UIView 后 NSConstraints 使应用程序崩溃

转载 作者:行者123 更新时间:2023-11-30 13:11:51 25 4
gpt4 key购买 nike

我有一个自定义 UIView,我使用此函数在 View Controller 中实例化它,displayTimer 是 View Controller 的 iVar:

func changeViewModeTo(mode: String){

if mode == "settings" {
addSettingsModeConstraints()
animatedLayoutIfNeeded(removeView: true)
}
if mode == "timer" {

displayedTimer = TimerView.init()
displayedTimer.frame = CGRect(x: (self.view.bounds.size.width)/2 - 50, y: (self.view.bounds.size.height)/2 - 80, width: 100, height: 160)

let colors = timer.getColorScheme()
displayedTimer.setColorScheme(colorLight: colors["lightColor"]!, colorDark: colors["darkColor"]!)
displayedTimer.setTimeRemainingLabel(timer.duration)
displayedTimer.setCountDownBarFromPercentage(1.0)
displayedTimer.layer.zPosition = 100 //make sure the timer view sits on top of the settings panel
displayedTimer.timerLabel.hidden = false
displayedTimer.translatesAutoresizingMaskIntoConstraints = false

let pinchGestureRecogniser = UIPinchGestureRecognizer(target: self, action: #selector(self.pinchDetected(_:)))

displayedTimer.addGestureRecognizer(pinchGestureRecogniser)

self.view.addSubview(displayedTimer)

addTimerModeConstraints()
animatedLayoutIfNeeded(removeView: false)

}

}

如果模式设置为计时器,那么它会创建 UIView 的子类并为其设置实例变量,添加约束以使其全屏,然后调用动画的layoutIfNeeded()。如果设置的模式是settings,那么它会停用timerConstraints,添加新的约束来缩小 View ,调用动画layoutIfNeeded,然后从superView中删除 View 。

func animatedLayoutIfNeeded(removeView removeView: Bool){
UIView.animateWithDuration(0.2, delay: 0, options: [UIViewAnimationOptions.CurveEaseIn] , animations: {
self.view.layoutIfNeeded()
}) { (true) in
if removeView == true {
self.displayedTimer.removeFromSuperview()
}
}
}

使用这些方法添加和删除约束(settingsConstraints和timerConstraints是 View Controller 的iVar):

//MARK: - Layout Constraints
func addSettingsModeConstraints() {

let views = ["timerView": displayedTimer]

let timerHorizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-75-[timerView]-75-|",
options: [],
metrics: nil,
views: views)
settingsConstraints += timerHorizontalConstraints

let timerVerticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|-105-[timerView]-85-|",
options: [],
metrics: nil,
views: views)
settingsConstraints += timerVerticalConstraints

NSLayoutConstraint.deactivateConstraints(timerConstraints)
NSLayoutConstraint.activateConstraints(settingsConstraints)
}

func addTimerModeConstraints() {

let views = ["timerView": displayedTimer]

let timerHorizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"H:|-0-[timerView]-0-|",
options: [],
metrics: nil,
views: views)
timerConstraints += timerHorizontalConstraints

let timerVerticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat(
"V:|-0-[timerView]-0-|",
options: [],
metrics: nil,
views: views)
timerConstraints += timerVerticalConstraints

NSLayoutConstraint.activateConstraints(timerConstraints)
}

changeViewModeTo 从捏合手势识别器调用(负捏合设置一种模式,正捏合设置另一种模式)。

我第一次捏合时, View 就会创建并全屏显示。然后我反向捏合, View 就会缩小并被删除。然后,当我再次捏捏以启动应用程序崩溃的过程时,没有控制台错误,但代码行上有红色错误: NSLayoutConstraint.activateConstraints(timerConstraints)

red error in xcode

我猜测删除 subview 会导致对 NSConstraints 的引用消失?

任何想法都会很棒,因为我无法弄清楚。

最佳答案

事实证明这是一个简单的修复,在重新创建和激活它们之前对 settingsConstraintstimerConstraints 调用 removeAll() 即可解决问题.

关于ios - 第二次加载 UIView 后 NSConstraints 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com