2016-07-28 2 views
0

Я получил пользовательский UIView, что я создаю экземпляр в контроллере представления с этой функцией, displayedTimer является Ивар контроллера вида:NSConstraints сбой приложения после второй нагрузки UIView

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(). Если установленный режим - это настройки, то он деактивирует timerConstraints, добавляет новые ограничения для сжатия представления, вызывает анимированный layoutIfNeeded, а затем удаляет представление из супервизора.

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 являются IVARS контроллера зрения):

//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 вызывается из пинч жест распознавани (отрицательный прижимные устанавливает один режим, положительный пинч устанавливает другой режим).

В первый раз, когда я зажимаю, представление создается и переходит в полноэкранный режим. Затем я отжимаю пинч, и вид сжимается и удаляется. Затем, когда я зажать снова начать процесс аварий приложений, нет никаких ошибок консоли, но есть красная ошибка по строке коды: NSLayoutConstraint.activateConstraints(timerConstraints)

red error in xcode

Я предполагаю, что удаления подвида вызвал ссылка на NSConstraints исчезнет?

Любые мысли были бы замечательными, поскольку я не могу понять это.

ответ

0

Оказалось, что это простое исправление, позвоните removeAll() по телефону settingsConstraints и timerConstraints, прежде чем воссоздать их и активировать их.

Смежные вопросы