2016-12-21 6 views
0

У меня есть этот редактируемый текстовый вид внутри ячейки таблицы, maximumNumberOfLines установлен в 4 и до byClipping. Это работает довольно много, как предполагалось, однако, кажется, можно вводить на ширину зрения текста, например, так:Распознавать символ, который не отображается в текстовом виде

Infinite typing

Хотя символы не видны они хранятся где-то, потому что для того, чтобы получить назад к видимому тексту, необходимо удалить столько, сколько вы набрали за пределами границ.

Я изо всех сил пытаюсь найти что-то уникальное в отношении этих невидимых персонажей, так что простой deleteBackward() выполняет эту работу внутри оператора if. Таким образом, пользователь не может физически вводить границы обзора текста.

Что-то об этих невидимых персонажах я могу идентифицировать в textView:shouldChangeTextIn, так что я deleteBackwards() и недействителен тип?

+0

Попробуйте преобразовать решение размещенного здесь Свифт: http://stackoverflow.com/questions/21889657/uitextviews-text-going-beyond-bounds – AnthonyW

ответ

0

Место это в UITextViewDelegate:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 
    if text.isEmpty { // Always allow backspace 
     return true 
    } 
     let numLines: Int = Int(textView.contentSize.height/textView.font!.lineHeight); 
     return numLines <= 4 
    } 

Было бы лучше поменять, что жёстко 4 для хорошей постоянной или что-то.

Примечание: Это может допускать 1 дополнительный символ на «пятой» линии. Чтобы этого избежать, вам нужно будет добавить дополнительный код, чтобы предвидеть, какой будет размер содержимого, и соответствующим образом реагировать.

+0

Спасибо, но это на самом деле не что я искал. Не было никаких проблем с максимальным количеством строк, поскольку константа 'maximumNumberOfLines' табличного представления была установлена ​​ранее и работала. Проблема заключалась в переполнении текста в горизонтальном направлении, а не по вертикали. – rodrigochousal

+0

Я провел некоторое тестирование и посмотрел на другие решения на SO. Это ограничивает дополнительные символы до 1. Другие решения позволят вам продолжать печатать с экрана. Если реализация 'UITextView' не была скрыта, было бы намного проще решить. – AnthonyW

0

Я нашел caretRect ширину для текстового просмотра, когда текст переполнен был немного шире, чем все другие предыдущие строки при переполнении текста. Это было непохоже на contentSize и textView.frame.size, которые не менялись при переполнении букв. Это позволило мне распознать переполнение и удалить соответствующий символ. Вот полная реализация:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { 

    let textRect = textView.caretRect(for: textView.endOfDocument) 

    //Maximum length of a character is about 10 
    if textView.contentSize.width - textRect.maxX < 10 { 

     // If user is already deleting, don't delete twice 
     if text != "" { 
      textView.deleteBackward() // return false works too 
     } 
    } 

    return true 
}