2016-07-20 4 views
8

Я пытаюсь иметь TextView, похожий на iPhone сообщений, где TextView изначально имеет ограничение (высота < = 100) и scrollEnabled = ложьДинамические UITextView поведение mislocation

Это ссылка на проект: https://github.com/akawther/TextView

Текстовое представление увеличивается по высоте в зависимости от размера содержимого, как на изображении слева, пока не достигнет высоты 100, а для параметра scrollEnabled установлено значение true. Он отлично работает до тех пор, пока я не нажму кнопку «отправить» в правом нижнем углу, где textView станет пустым и вернется к исходной высоте, а scrollEnabled станет ложным. Среднее изображение показывает, что происходит, когда я нажимаю кнопку. Когда я начинаю вводить текст, он перемещается вниз, как вы видите на последнем изображении справа. Я хочу, чтобы у вас была возможность нажать кнопку и устранить поведение, показанное на среднем изображении, как я могу это исправить?

enter image description here

import UIKit 

class ViewController: UIViewController, UITextViewDelegate { 

@IBOutlet weak var bottomConstraint: NSLayoutConstraint! 
@IBOutlet weak var messageTextView: UITextView! 
@IBOutlet weak var parent: UIView! 
let messageTextViewMaxHeight: CGFloat = 100 


override func viewDidLoad() { 
    super.viewDidLoad() 

    self.messageTextView.delegate = self 
} 

@IBAction func Reset(sender: AnyObject) { 
    messageTextView.text = "" 
    messageTextView.frame.size.height = messageTextView.contentSize.height 
    messageTextView.scrollEnabled = false 
    self.parent.layoutIfNeeded() 
} 

func textViewDidChange(textView: UITextView) { 
    if textView.frame.size.height >= self.messageTextViewMaxHeight { 

     textView.scrollEnabled = true 

    } else { 
     textView.scrollEnabled = false 
     textView.frame.size.height = textView.contentSize.height 
    } 
} 

} 

Вы можете повторить свой вопрос, выполнив следующие действия в проекте GitHub: 1. продолжайте вводить слова и нажатие вводит, пока вы не начнете видеть свиток 2. Нажмите на кнопку, вы увидите что текст просматривается в синем контейнере . Это проблема, которую я хочу устранить!

+0

увидеть это TextView прокрутки, Вы должны дать размер содержимого http://stackoverflow.com/questions/37152494/uitextview-scrollenabled-yes-not- work-after-set-scrollenabled-no-in-ios8/37210762 # 37210762 –

+0

Прокрутка textView работает нормально. Я хочу, чтобы можно было нажать кнопку отправки и устранить поведение, показанное на среднем изображении. – user3126427

+0

«Он отлично работает, пока я не нажму кнопку« отправить »в правом нижнем углу« Покажите код, который запускает кнопка «отправить». – matt

ответ

2

Попробуйте сильфон кода -

@IBAction func Reset(sender: AnyObject) { 
     messageTextView.scrollEnabled = false 
     messageTextView.text = "" 
     messageTextView.frame.size.height = messageTextView.contentSize.height 
     parent.frame.size.height = 20 

    self.view.layoutIfNeeded() 
} 

func textViewDidChange(textView: UITextView) { 
    if textView.contentSize.height >= self.messageTextViewMaxHeight { 

     textView.scrollEnabled = true 

    } else { 

     textView.frame.size.height = textView.contentSize.height 
     textView.scrollEnabled = false 
    } 
} 
+0

Я загрузил ваш проект. Когда я набираю текст, пока не достигнет MaxHeight, и TextView начнет прокрутку. Затем я нажимаю кнопку, я все еще вижу такое же поведение. TextView изменился на правильный размер, но не в правильном положении, как изображения, которые я приложил к вопросу. – user3126427

+0

Хорошо, я изменил код, пожалуйста, перепродайте и проверьте. –

+0

Наконец-то это сработало :) – user3126427

1

Ваш вопрос о том, что UITextView имеет противоречивые свойства:

  • Место на экране
  • Размер

Размер будучи стесненными будет вызывать проблемы, когда вам нужно изменяемого TextView. Кроме того, при изменении размера TextView его местоположение в этом случае изменяется.

Альтернативного метод подойти к вопросу:

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

Надеюсь, что это поможет.

+0

Я изменил ограничение TextView только по отношению к дну, но я все еще вижу такое же поведение. Я добавил ссылку на проект github в вопросе. BTW Я хочу, чтобы пользователь мог прокручивать textView после достижения высоты 100, то есть у меня есть ограничение по высоте. – user3126427

+0

Эй, @ user3126427, я попробовал это сам, и это сработало как шарм. Если вы встроили его в другой проект и там он не работает, попробуйте воссоздать View Controller и настроить его аналогичным образом, чтобы убедиться, что вы ничего не пропустили. –

+0

такие вещи случаются все время для меня в моих проектах, где ограничения смешались в окне, но воссоздание окна таким же образом может отфильтровывать то, что вы делали неправильно раньше. Лично я не знаю, как что-то идет не так, как вы, поскольку я тестировал его, и он работал именно так, как вы намеревались работать. –

0

Если вы используете автоматический макет, вы должны обновлять его до ограничения, вместо обновления textView.frame. Попробуйте создать IBOutlet для вашего textView heightConstraint, а затем установите для него обновленную высоту.

IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint! 

//calculate the height and update the constant 
textViewHeightConstraint.constant = textView.contentSize.height 
+0

Проверьте мою ссылку github – user3126427