2015-12-28 2 views
4

У меня есть datePicker, который я хочу анимировать внутри и снаружи снизу, изменив его верхнее ограничение на верх супер-вид.Animate view, изменяя константу константы

У меня установлен IBOutlet и на viewDidLoad. Мне разрешено изменять константу ограничения.

enter image description here

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.datePickerTopConstraint.constant = self.view.frame.size.height // I can set this to whatever and it will persist 
    } 

Однако через IBAction я пытаюсь установить константу на другое значение, и не сохраняется.

@IBAction func showDatePicker() { 
    UIView.animateWithDuration(0.25, animations: { 
    () -> Void in 
     self.datePickerTopConstraint.constant = self.view.frame.size.height - self.datePicker.frame.size.height // Doesn't persist 
     self.view.layoutIfNeeded() 
    }) 
    } 

кажется, что я могу изменить это и есть Datepicker появляются в представлении (в viewDidLoad) и анимировать его из поля зрения, но не имеют Datepicker появляются вне поля зрения (как в приведенном выше примере) и анимировать внутри вида. Что я пропустил?

EDIT

Устанавливая верхний ограничение постоянной высоты в Super View I (по какой-то причине я не понимаю) также установить высоту выбора даты до 0, который в свою очередь, делает вычитание в showDatePicker бессмысленного ,

ответ

3

Реструктурируйте код так, чтобы в методе кнопки работала, сначала выработав новое значение константы, а затем вызвав анимацию. Вытяните вычисление heigh в его собственную функцию. Я думаю, что self.datePicker.frame.size.height не существует и приводит к 0, но я бы это проверил с помощью отладчика.

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    datePickerTopConstraint.constant = constantForDatePickerViewHeightConstraint() 
    view.setNeedsLayout() 

} 


@IBAction func showDatePicker(button: UIButton) { 

    // Check constraint constant 
    if datePickerTopConstraint.constant == self.view.frame.size.height { 

     // Date picker is NOT visible 
     datePickerTopConstraint.constant = constantForDatePickerViewHeightConstraint() 

    } else { 
     // Date picker is visible 
     datePickerTopConstraint.constant = self.view.frame.size.height 
    } 


    UIView.animateWithDuration(0.25, 
     animations: {() -> Void in 
     self.view.layoutIfNeeded() 
    }) 
} 

private func constantForDateOPickerViewHeightConstraint() -> CGFloat { 

    var value : CGFloat = 200.0 

    // Workout value you want to as the constant for the constraint. 

    return value 
} 
+0

You're right, в то время как 'self.datePicker' действительно существует, его высота равна нулю, если я устанавливаю его« верхнюю константу ограничения »на ее высоту родительского представления. Это похоже на то, что я делаю это. Спасибо, что указали мне в правильном направлении! :) – MdaG

+0

'po self.datePicker.frame' в' showDatePicker' дает '(origin = (x = 16, y = 667), size = (width = 343, height = 0))' – MdaG

0

Попробуйте это:

func showDatePicker() { 
    self.view.layoutIfNeeded() 
    UIView.animateWithDuration(0.25, animations: { 
    () -> Void in 
     self.datePickerTopConstraint.constant = self.view.frame.size.height - self.datePicker.frame.size.height // Doesn't persist 
     self.view.layoutIfNeeded() 
    }) 
    } 

Вы должны вызвать layoutIfNeeded до анимации Бок и в блоке. Теперь он правильно вычисляет представления. Как я уже сказал, также нет смысла устанавливать ограничения в viewDidLoad, если вы собираетесь это делать в любом месте в viewWillAppear. Вид не завершил настройку в viewDidLoad, поэтому нет ограничений, которые можно установить правильно. Вызов layoutIfNeeded перед блоком анимации исправляет эту ошибку, и вам все равно нужно, чтобы он мог правильно рассчитать и в будущем.

+0

Я думаю, что вы слишком быстро прочитали мой вопрос. :) Перемещение представления должно выполняться при нажатии кнопки. Исходное ограничение задано как раз в viewDidLoad – MdaG

+0

См. Мое редактирование. Должен работать сейчас. – Kex

+0

Добавление self.view.layoutIfNeeded() перед вызовом анимации не влияет ни на что в моем случае (я проверил его), так как нет ожидающих изменений в макете, но вы правы, что в целом разумно это делать , Также я думаю, что вы ошибаетесь в том, что представление не выполняется в viewDidLoad. Я проверил все в отладчике и вижу, что все данные так, как мне нужно. Даже ограничение IBOutlet устанавливается правильно, и начальная позиция datePicker может быть установлена, насколько я хочу. Перемещение исходной настройки ограничения на viewWillAppear не изменяет результат. :( – MdaG

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