Я создаю новое приложение и хочу добавить область сообщений, например:

enter image description here

Когда пользователь щелкает текстовую область, клавиатура будет отображаться, и пользователь начнет писать сообщение, правая кнопка будет кнопкой отправки, а текстовая область будет расти, как:

enter image description here

Как это сделать проще всего?

У меня есть идея сделать это, но я думаю, что это не лучший способ. Думаю решить это программно. В viewLoad я программно создам кнопку и текстовую область, а затем, когда пользователь начнет писать, я создам их снова.

2
John 12 Май 2016 в 09:11

3 ответа

Лучший ответ

Как объясняется в официальной документации Apple, вы можете работать с { {X0}} делегировать методы для перехвата различных состояний.

Например, вы можете использовать textFieldDidBeginEditing (_ :), чтобы обработать момент, когда пользователь начинает редактировать. Здесь вы можете обрабатывать ограничения, чтобы увеличить текстовое поле (обратите внимание, вы должны работать с ограничениями, если вы используете авто-раскладку, не изменяйте фрейм):

func textFieldDidBeginEditing(textField: UITextField!) {
    //
    // hide photo button
    // change mic button to send button
    self.textFieldTrailingConstraint.constant = 10.0
    UIView.animateWithDuration(0.5) {
        self.view.layoutIfNeeded()
    }
}

После этого вы можете обрабатывать других делегатов:

func textFieldShouldEndEditing(textField: UITextField!) -> Bool {  
    return false
}

func textFieldShouldReturn(textField: UITextField!) -> Bool { 
  textField.resignFirstResponder()

    return true
}

Где вы можете повторить анимацию или делать все, что захотите.

1
Alessandro Ornano 12 Май 2016 в 07:11

Я также рекомендую решить это в коде. При загрузке представления вам нужно будет создать все кнопки, и если пользователь начнет писать, вам следует воссоздать некоторые из кнопок. Но имейте в виду, что вы должны убедиться, что текстовое поле является тем же экземпляром, или что вы должны отказаться от него с помощью кода.

0
regetskcob 12 Май 2016 в 06:27

В дополнение к делегатам текстового поля вам также необходимо обрабатывать клавиатуру:

override func viewDidLoad() {
super.viewDidLoad()

NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillDisappear:", name: UIKeyboardWillHideNotification, object: nil)}

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
NSNotificationCenter.defaultCenter().removeObserver(self)}

func keyboardWillAppear(notification: NSNotification){

var userInfo:NSDictionary = notification.userInfo!
var keyboardSize:CGSize = userInfo.objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue().size

var contentInsets:UIEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0)

self.tableView.contentInset = contentInsets
self.tableView.scrollIndicatorInsets = contentInsets

var messageFrame:CGRect = self.commentField.frame
messageFrame.origin.y -= keyboardSize.height
self.commentField.frame = messageFrame}

func keyboardWillDisappear(notification: NSNotification){
var userInfo:NSDictionary = notification.userInfo!
var keyboardSize:CGSize = userInfo.objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue().size

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationDuration(0.25)
self.tableView.contentInset = UIEdgeInsetsZero
UIView.commitAnimations()

self.tableView.scrollIndicatorInsets = UIEdgeInsetsZero

var messageFrame:CGRect = self.commentField.frame
messageFrame.origin.y += keyboardSize.height
self.commentField.frame = messageFrame}
0
Irfan 12 Май 2016 в 07:56