ich eine benutzerdefinierte UIView hätte, dass ich in einem View-Controller mit dieser Funktion instanziiert ist displayedTimer ein iVar des View-Controllers:NSConstraints App nach dem zweiten Last von UIView stürzt
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)
}
}
Wenn der Modus eingestellt ist zu Timer erstellt es dann eine Unterklasse von UIView und legt eine Instanzvariable fest, Constraints werden hinzugefügt, um es Vollbild zu machen, und dann wird ein animiertes layoutIfNeeded() aufgerufen. Wenn der eingestellte Modus Einstellungen sind, dann deaktiviert er den TimerConstraints, fügt neue Einschränkungen hinzu, um die Ansicht zu verkleinern, ruft ein animiertes layoutIfNeeded auf und entfernt dann die Ansicht aus der superView.
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()
}
}
}
Die Einschränkungen werden hinzugefügt und entfernt werden mit diesen Verfahren (settingsConstraints und timerConstraints ivars der View-Controller) ist:
//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 aus einer Pinch-Geste Erkenner (negativen pinch Sätze ein Modus genannt wird, positive Prise setzt einen anderen Modus).
Das erste Mal, wenn ich zwicke, wird die Ansicht erstellt und wird im Vollbildmodus angezeigt. Ich vergesse dann die Quetschung und die Ansicht schrumpft und wird entfernt. Dann, wenn ich wieder kneifen, den Prozess über die App-Abstürze zu starten, gibt es keine Konsole Fehler, aber es ist ein roter Fehler über die Codezeile: NSLayoutConstraint.activateConstraints(timerConstraints)
Ich vermute, die subview Entfernen hat dazu geführt, der Verweis auf NSConstraints zu verschwinden?
Alle Gedanken wären großartig, wie ich es nicht herausfinden kann.