2016-07-28 30 views
0

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)

red error in xcode

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.

Antwort

0

So stellt sich heraus, dass dies eine einfache Lösung ist, rufen Sie removeAll() auf settingsConstraints und timerConstraints bevor Sie sie neu erstellen und aktivieren sie das Problem löst.