10

Я провел несколько дней на этом без какого-либо решения.как я могу увеличить высоту входного окна AccessAccessoryView

У меня есть inputAccessoryView, который состоит из UIView, содержащего textView и двух кнопок. Поведение inputAccessoryView соответствует ожиданиям и отлично работает во всех случаях, кроме одного.

Когда высота текста увеличивается, я пытаюсь увеличить высоту inputAccessoryView на ту же сумму. Когда я переопределяю высоту inputAccessoryView в textViewDidChange, inputAccessoryView увеличивает высоту вниз по клавиатуре, а не вверх.

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

func textViewDidChange(textView: UITextView) { 

    var contentSize = messageTextView.sizeThatFits(CGSizeMake(messageTextView.frame.size.width, CGFloat.max)) 

    inputAccessoryView.frame.size.height = contentSize.height + 16 

} 

добавления

inputAccessoryView.setTranslatesAutoresizingMaskIntoConstraints(true) 

приведенный выше код помогает и inputAccessoryView высота увеличивается вверх правильно, однако я получаю Невозможно одновременно удовлетворяют ограничениям, несколько ограничений, и это очень трудно идентифицировать преступников. Также я получаю нечетный эффект textView, создающий дополнительное пространство ниже для каждого второго экземпляра новой строки.

спасибо.

+0

я заметил первый вызов textViewDidChange делает правильно изменить размер inputAccessoryView без линии setTranslatesAutoresizingMaskIntoConstraints, но последующие вызовы не имеют никакого эффекта. Интересно, почему это так и как я могу восстановить его в этом начальном состоянии каждый раз? – alionthego

ответ

18

Чтобы сделать вид дополнительного аксессуара расти вертикально, вы просто установите его autoresizingMask = .FlexibleHeight, вычислите его intrinsicContentSize и дайте каркасу сделать все остальное.

Код:

class InputAccessoryView: UIView, UITextViewDelegate { 

    let textView = UITextView() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     // This is required to make the view grow vertically 
     self.autoresizingMask = UIViewAutoresizing.FlexibleHeight 

     // Setup textView as needed 
     self.addSubview(self.textView) 
     self.textView.translatesAutoresizingMaskIntoConstraints = false 
     self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 
     self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 

     self.textView.delegate = self 

     // Disabling textView scrolling prevents some undesired effects, 
     // like incorrect contentOffset when adding new line, 
     // and makes the textView behave similar to Apple's Messages app 
     self.textView.scrollEnabled = false 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func intrinsicContentSize() -> CGSize { 
     // Calculate intrinsicContentSize that will fit all the text 
     let textSize = self.textView.sizeThatFits(CGSize(width: self.textView.bounds.width, height: CGFloat.max)) 
     return CGSize(width: self.bounds.width, height: textSize.height) 
    } 

    // MARK: UITextViewDelegate 

    func textViewDidChange(textView: UITextView) { 
     // Re-calculate intrinsicContentSize when text changes 
     self.invalidateIntrinsicContentSize() 
    } 

} 
+0

Спасибо за очень сжатый ответ. – alionthego

+0

Как вы узнали, как это сделать? Это похоже на волшебство, как это работает! Мне бы хотелось узнать, как прошел этот процесс, чтобы изучить эту технику. –

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

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