Установите ширину и высоту UITextView на основе динамического текста

#ios #swift #uilabel #uitextview #swift3

#iOS #swift #uilabel #uitextview #swift3

Вопрос:

Я создаю приложение для чата, в котором каждое сообщение вставляется в строку внутри таблицы. Каждая строка содержит аватар и сообщение. Я хочу установить ширину и высоту UITextArea в соответствии с длиной текста, который нужно поместить внутрь.

Ниже приведен код, который я использовал. Но здесь и высота, и ширина постоянны (200×50)

PS: Я новичок в Swift и ios, и я использую Swift 3. Каждый код, который я получил после поиска, находится в objective-c или swift 2

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell  = Bundle.main.loadNibNamed("ChatBox1", owner: self, options: nil)?.first as! ChatBox1


        let myTextField: UITextView = UITextView(frame: CGRect(x: 30, y: 20, width: 200.00, height: 50.00));
        cell.addSubview(myTextField)
        myTextField.isScrollEnabled = false
        myTextField.isUserInteractionEnabled = false
        myTextField.backgroundColor = UIColor.lightGray
        myTextField.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
        myTextField.layer.cornerRadius = 5
        print(myTextField.intrinsicContentSize)


        let image = UIImage(named: "agent")
        let imageView = UIImageView(image: image)
        imageView.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
        cell.addSubview(imageView)


        return cell
    }
  

введите описание изображения здесь

Комментарии:

1. Попробуйте cell.sizeToFit()

2. Взгляните на boundingRect(with:options:attributes:context:) , который является методом NSString . Вы можете использовать этот метод для вычисления размера всей строки, а затем соответствующим образом установить textView а также высоту ячейки

3. Попробуйте cell.sizeToFit(), а также попробуйте внутри вашего номера строки ….. TableView.estimatedRowHeight = 44.0 TableView.RowHeight = UITableViewAutomaticDimension. Это решит вашу проблему….

4. Это не имеет никакого отношения к вашему текстовому полю.проверьте мой другой комментарий. это ответ, который вы искали….

5. Внутри вашей функции TableView(TableView: UITableView!, раздел numberOfRowsInSection: Int) -> Int { верните YourArray.count }

Ответ №1:

Эти два метода используются для установки высоты и ширины textview в соответствии с текстом в чате.

Вы можете использовать их. (swift 2.3)

 var screenrect = UIScreen.mainScreen().bounds

func GET_WIDTH(textView : UITextView , text : String)-> CGFloat
    {
        textView.text = text;
        let size = textView.bounds.size
        let newSizeWidth = textView.sizeThatFits(CGSize(width: CGFloat.max, height: size.height))
        // Resize the cell only when cell's size is changed
        if size.width != newSizeWidth.width
        {
            if( newSizeWidth.width > screenrect.width-120 )
            {
                textView.layer.frame.size.width = screenrect.width-120;

            }
            else if ( newSizeWidth.width < 40 )
            {
                textView.layer.frame.size.width = 40
            }
            else
            {
                textView.layer.frame.size.width = newSizeWidth.width;
            }
        }
        return textView.layer.frame.size.width   40;
    }

    func GET_HEIGHT(textView : UITextView , text : String)-> CGFloat
    {
        textView.text = text;
        let size2 = textView.bounds.size
        let newSize = textView.sizeThatFits(CGSize(width: size2.width, height: CGFloat.max))
        if size2.height != newSize.height
        {
            if( newSize.height < 40 )
            {
                textView.layer.frame.size.height = 40
            }
            else
            {
                textView.layer.frame.size.height = newSize.height
            }
        }
        return textView.layer.frame.size.height   15;
    }
  

Вы должны вызвать функции textview подобным образом, чтобы установить высоту и ширину.

  let textViewRight=UITextView(frame: CGRectMake(0, 4, 40, 40));
 textViewRight.layer.frame.size.width = GET_WIDTH(textViewRight, text: currentObject.chat_userMessage)
 textViewRight.layer.frame.size.height = GET_HEIGHT(textViewRight, text: currentObject.chat_userMessage)
  

Ответ №2:

Попробуйте этот код:

Ответ 1:

    func tableView(tableView:UITableView!, numberOfRowsInSection section: Int) -> Int { 

        yourTableViewName.estimatedRowHeight = 44.0 // Standard tableViewCell size
        yourTableViewName.rowHeight = UITableViewAutomaticDimension

   return yourArrayName.count } 


   And also put this code inside your Cell for incase...
   yourCell.sizeToFit() 
  

Ответ 2:

     override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
 }

    override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
 }
  

Комментарии:

1. Это может быть проблема с макетом. проверьте свои ограничения.

Ответ №3:

в viewDidLoad добавьте это

 tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
  

Просто добавьте эти две строки, и ваша проблема будет решена

Ответ №4:

Возьмите ограничение высоты TextView и установите его равным размеру содержимого TextView.

В качестве альтернативы, если вы используете autolayout, вы можете установить для свойства content hugging and compression значение 1000. Это должно расширить вашу ячейку в соответствии с содержимым.