【问题标题】:Autoadapt height of View自动调整视图高度
【发布时间】:2022-01-09 07:43:25
【问题描述】:

我正在使用 swift 语言在 xCode 中构建一个聊天视图。 我创建了两个自定义单元格,一个用于发送消息,另一个用于接收消息。问题是当消息文本大于 iPhone 屏幕的宽度时。然后如果文本太大,我需要配置两个视图以增加高度。 所以这是我的观点: 我配置了 View Lbl Message >= 30 的高度,但是如果您看到 xCode 设置为 RED,那么该约束对我来说就是错误所在。

无论如何,这是我的 iPhone 在应用程序仍在运行时的结果:

如果你在蓝色单元格中的文本“mio”之后仔细检查,你可以看到还有其他文本但没有显示。

编辑

我添加了 ChatVC 控制器,UITableView 在哪里:

//
//  ChatVC.swift
//  appUser
//
//  Created by mac on 11/10/21.
//  Copyright © 2021 Michele Castriotta. All rights reserved.
//

import UIKit
import SDWebImage
import SwiftyJSON
import AVFoundation

class ChatVC: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var aggiorna:Bool = false
    var arrMsgs:[ChatModel] = []
    var receiverId = ""
    var storeName = ""
    var userName = ""
    var userId = ""
    var strReason = ""
    var strReasonID = ""
    var strType = "User"
    var strRighTitle = ""
    var strPrname = ""
    var daNotifica:Bool = false
    
    @IBOutlet weak var viewWriteMessage: UIView!

    @IBOutlet weak var lblTitleChat: UILabel!
    @IBOutlet weak var txtMessage: UITextField!
    @IBOutlet weak var tableViewChat: UITableView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showProgressBar()
        self.tableViewChat.separatorColor = UIColor.clear
        self.viewWriteMessage.setCornerRadius(cornerRadius: 22, borderColor: nil, borderWidth: nil)
        userId = kUserDefault.value(forKey: USERID) as! String
        self.lblTitleChat.text = self.storeName
        wsGetChatAgain()
    }
    
    func wsGetChatAgain()  {

     //   showProgressBar()
        var paramDict : [String:AnyObject] = [:]
        paramDict["receiver_id"]  =   receiverId as AnyObject
        paramDict["sender_id"]  =   userId as AnyObject

        CommunicationManeger.callPostServiceReturnJson(apiUrl: RouterProd.get_chat.url(), parameters: paramDict,  parentViewController: self, successBlock: { (responseData, message) in

            DispatchQueue.main.async {
                do {
                    let chats = try JSONDecoder().decode(ResponseChatModel.self, from: responseData as! Data)
                    if(chats.status == "1") {
                        self.arrMsgs  = chats.result
                        
                        DispatchQueue.main.async {
                               // Main thread, called after the previous code:
                               // hide your progress bar here
                            self.tableViewChat.reloadData()
                            self.hideProgressBar()
                        }
                        //self.scrollToBottom()
                        //self.lbl_ChatReason.text = self.strReason
                    }
                }catch{
                   print("errore durante la decodifica dei dati: \(error)")
                    self.hideProgressBar()
                   //Utility.noDataFound("Errore", tableViewOt: self.tableViewChat, parentViewController: self)
               }
            }
        }, failureBlock: { (error : Error) in
            Utility.showAlertMessage(withTitle: EMPTY_STRING, message: (error.localizedDescription), delegate: nil,parentViewController: self)
            self.hideProgressBar()
        })
        self.aggiorna = true
        self.aggiornaChat()
    }
    
    func aggiornaChat(){
        if(aggiorna){
            DispatchQueue.main.asyncAfter(deadline: .now() + 15.0, execute: wsGetChatAgain)
        }
        
    }
    
    @IBAction func btnBack(_ sender: Any) {
        self.aggiorna = false
        if(self.daNotifica == false){
            self.navigationController?.popViewController(animated: true)
        }else{
            Switcher.updateRootVC()
        }
        
    }
    
    //MARK: - Table View Methods
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.arrMsgs.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let message = self.arrMsgs[indexPath.row]
        var messaggio = message.chatMessage
        var orario = Utility.getDateStringFromString(dateString: message.date, inputFormate: "yyyy-MM-dd HH:mm:ss", outputFormate: "HH:mm")
        
        
        if(message.senderID == userId){
            //messaggio inviato dal utente
            let cell = tableView.dequeueReusableCell(withIdentifier: "ChatCell", for: indexPath) as! ChatCell
            cell.lblMessage.text = messaggio
            cell.lblTime.text = orario
            var maximumLabelSize: CGSize = CGSize(width: 280, height: 9999)
            var expectedLabelSize: CGSize = cell.lblMessage.sizeThatFits(maximumLabelSize)
            // create a frame that is filled with the UILabel frame data
            var newFrame: CGRect = cell.lblMessage.frame
            // resizing the frame to calculated size
            newFrame.size.height = expectedLabelSize.height
            // put calculated frame into UILabel frame
            cell.lblMessage.frame = newFrame
            return cell
        }else{
            //messaggio inviato dallo o runner
            let cell = tableView.dequeueReusableCell(withIdentifier: "ChatCell2", for: indexPath) as! ChatCell2
            cell.lblMessage.text = messaggio
            var maximumLabelSize: CGSize = CGSize(width: 280, height: 9999)
            var expectedLabelSize: CGSize = cell.lblMessage.sizeThatFits(maximumLabelSize)
            // create a frame that is filled with the UILabel frame data
            var newFrame: CGRect = cell.lblMessage.frame
            // resizing the frame to calculated size
            newFrame.size.height = expectedLabelSize.height
            newFrame.size.width = expectedLabelSize.width
            // put calculated frame into UILabel frame
            cell.lblMessage.frame = newFrame
            cell.lblTime.text = orario
            return cell
        }
        
    }

    @IBAction func sendMessage(_ sender: Any) {
        if txtMessage.text == "Scrivi qui..." || txtMessage.text!.count == 0 {
            GlobalConstant.showAlertMessage(withOkButtonAndTitle: APPNAME, andMessage: "Per favore scrivi del testo...", on: self)
        } else {
            wsSendMessage()
        }
    }
    
    func wsSendMessage()  {
        self.showProgressBar()
        
        var localTimeZoneIdentifier: String { return TimeZone.current.identifier }
        var paramDict : [String:AnyObject] = [:]
        paramDict["receiver_id"]   =  receiverId as AnyObject
        paramDict["sender_id"]    =   userId as AnyObject
        paramDict["chat_message"]  =  self.txtMessage.text! as AnyObject
        paramDict["timezone"]  =  localTimeZoneIdentifier as AnyObject
        paramDict["request_id"]  =   strReasonID as AnyObject
        paramDict["type"]  =   strType as AnyObject
        
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        var dataOra = formatter.string(from:Date())
        paramDict["date_time"]  =   "\(dataOra)" as AnyObject
        
        CommunicationManeger.callPostService(apiUrl: RouterProd.insert_chat.url(), parameters: paramDict,  parentViewController: self, successBlock: { (responseData, message) in

            DispatchQueue.main.async {
                let swiftyJsonVar = JSON(responseData)
                print(swiftyJsonVar)
                if(swiftyJsonVar["result"].stringValue == "successful") {
                    self.txtMessage.text = ""
                    self.view.endEditing(true)
                    self.wsGetChatAgain()
                }
                self.hideProgressBar()
            }
        }, failureBlock: { (error : Error) in
            Utility.showAlertMessage(withTitle: EMPTY_STRING, message: (error.localizedDescription), delegate: nil,parentViewController: self)
            self.hideProgressBar()
        })
    }
}

这是 chatCell 类

import UIKit

class ChatCell: UITableViewCell {

    @IBOutlet weak var lblMessage: UILabel!
    @IBOutlet weak var viewLblMessage: UIView!

    @IBOutlet weak var lblTime: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
        self.viewLblMessage.setCornerRadius(cornerRadius: 10, borderColor: nil, borderWidth: nil)
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

}

【问题讨论】:

  • 您不应该使用高度限制。相反,将Lbl Message 的前导、顶部、尾部和底部设置为其父视图,并将Lbl Message 的行数设置为零。
  • 看起来更像是UITableView 自动单元格高度问题。你为什么不发布你的表格视图代码?
  • @GustavoConde 这不是问题所在。他只是没有正确设置约束。
  • 我只是添加我的课程

标签: ios swift view


【解决方案1】:

如果您不知道文本的大小,请不要在视图中添加高度。您应该在不增加高度的情况下添加约束

【讨论】:

  • 我删除了高度,但如果我加载我的视图,我无法显示文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多