Я получил пользовательский 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)
Я предполагаю, что удаления подвида вызвал ссылка на NSConstraints исчезнет?
Любые мысли были бы замечательными, поскольку я не могу понять это.