2016-12-01 5 views
1

Я пытаюсь анимировать мой UIStackView, который содержит форму входа в систему всякий раз, когда появляется клавиатура. Я хочу сделать это, только отрегулировав ограничения из моего файла раскадровки.Ограничение размера с помощью анимации клавиатуры

Это мой макет:

Layout

Мой код изменяет нижнее ограничение в зависимости от размера клавиатуры.

@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) 

    keyboardHeightLayoutConstraint.isActive = false 
} 

func keyboardNotification(notification: NSNotification) { 
    keyboardHeightLayoutConstraint.isActive = true 
    if let userInfo = notification.userInfo { 
     let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue 
     let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 
     let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
     let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue 
     let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 

     if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height { 
      self.keyboardHeightLayoutConstraint?.constant = 0.0 
     } else { 
      self.keyboardHeightLayoutConstraint?.constant = (endFrame?.size.height)! + 20 
     } 
     UIView.animate(withDuration: duration, 
         delay: TimeInterval(0), 
         options: animationCurve, 
         animations: { self.view.layoutIfNeeded() }, 
         completion: nil) 
    } 
} 

В результате он только сокращает размер UIStackView, поскольку верхнее ограничение не позволит ей двигаться вверх, например:

Result

Это связанно с верхним ограничением в мой стек. Удаление этого ограничения решает проблему, но при меньших разрешениях форма может перекрываться с UIImageView. Есть ли способ обновить это ограничение, чтобы отразить изменения нижнего ограничения?

ответ

1

Вы можете настроить розетки как на верхние, так и на нижние ограничения и изменить их оба. Я делал это несколько раз.

Я не совсем ясно, на макете ограничения, но я предполагаю, что вы хотите добавить к ограничению нижней раскладки и вычесть из верхнего ограничения макета.

+0

Это именно то, что я хочу. Означает ли это, что мне нужно ограничение на выходное ограничение и ограничение на верхнюю выходную точку? Допустим, если дно получило +20, верх должен получить -20? Это будет работать без конфликтов ограничений? – Hapeki

+0

Да, это именно то, что я сделал. –

+0

И после этого вы смените изменение, когда спрячете клавиатуру (вычтите 20 снизу и добавьте 20 в верхнюю часть). –

0

Опустите приоритет этого ограничения (тот, который находится от представления изображения до представления стека) до 200. Приоритет 200 ниже, чем приоритеты сжатия содержимого по умолчанию, поэтому автоопределение прерывает его, прежде чем скрещивать другие виды.

+0

Я пробовал это, но это приводит к [! [Simulator Screen Shot 1 декабря 2016, 23.57.14.png] (https://s11.postimg.org/bbzs3lunn/Simulator_Screen_Shot_1_Dec_2016_23_57_14.png)] (https: // postimg .org/image/9wy7evtkf /) Верхнее ограничение отсутствует, поэтому можно накладываться на меньшие разрешения. – Hapeki

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

  • Нет связанных вопросов^_^