之前我正在使用标签并且工作正常。但我只是意识到我需要一个UITextView,而我似乎无法让它正常工作。
文字一直向右走,我再也看不到了。我需要它调整到之前使用标签工作的单元格的动态高度。
struct postStruct {
let username : String!
let message : String!
let photoURL : String!
let timeStamp: String!
let cellUserId : String!
}
class GeneralChatroom: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate {
@IBOutlet weak var messageTextField: UITextField!
@IBOutlet weak var tableView: UITableView!
var generalRoomDataArr = [postStruct]()
override func viewDidLoad() {
super.viewDidLoad()
//Key Board - self delegate for return key
messageTextField.delegate = self
//TableView Cell word wrap (Dynamic Text)
self.tableView.dataSource = self
self.tableView.delegate = self
self.tableView.estimatedRowHeight = 78
self.tableView.rowHeight = UITableViewAutomaticDimension
//Liquid Loader
let growColor = UIColor.red
let lineMatColor = UIColor(red: 11 / 255.0, green: 211 / 255.0, blue: 138 / 255.0, alpha: 1.0)
let lineMatFrame = CGRect(x: self.view.frame.width * 0.5 - 25, y: 500, width: 50, height: 50)
let lineMat = LiquidLoader(frame: lineMatFrame, effect: .Line(lineMatColor,4,1.0, growColor))
//Placement of liquid Loader
let screenSize = UIScreen.main.bounds
let screenWidth = screenSize.width
// let screenHeight = screenSize.height
lineMat.frame = CGRect(x:screenWidth - 55 , y: 20, width:20 , height: 20)
view.addSubview(lineMat)
//Start Here
let ref = FIRDatabase.database().reference()
//let userID = FIRAuth.auth()?.currentUser?.uid
ref.child("general_room").queryOrderedByKey().observe(.childAdded, with: {snapshot in
let snapDict = snapshot.value as? NSDictionary
let message = snapDict?["Message"] as? String ?? ""
let username = snapDict?["user_name"] as? String ?? ""
let userIDString = snapDict?["uid"] as? String ?? ""
let firebaseUserPhotoURL = snapDict?["photo_url"] as? String ?? ""
// print("username: " + username)
// print("message: " + message)
// print("URL: " + firebaseUserPhotoURL)
// print("Snapshot" + snapshot.key)
//Time String from Firbase Database
let timeString = snapDict?["time_stamp"] as? String ?? "2017-03-06 00:20:51"
//timeAgoSinceDate - Format and call function to recieve time of post
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let timeStampDate = dateFormatter.date(from: timeString)
let timeStamp = timeAgoSinceDate(date: timeStampDate!, numericDates: false)
//Assign array values
self.generalRoomDataArr.insert(postStruct(username: username, message: message, photoURL: firebaseUserPhotoURL, timeStamp: timeStamp, cellUserId: userIDString), at: 0)
self.tableView.reloadData()
})
//End Here
self.tableView.reloadData()
}//End ViewDidLoad
//MARK: Buttons (BackButton || Send Button)
@IBAction func backButtonPressed(_ sender: UIButton) {
self.performSegue(withIdentifier: "BackToRoom", sender: nil)
}
//Message Send button is pressed data uploaded to firebase
@IBAction func sendButtonPressed(_ sender: UIButton) {
//If a character exists will be uploaded to firebase
if ((messageTextField.text?.characters.count)! > 0) {
let message : String = self.messageTextField.text!
UploadGeneralChatRoom(message: message) //upload to general_room
self.messageTextField.text = nil
messageTextField.resignFirstResponder()//Quit keyboard
self.tableView.reloadData() //Reload tableView
//UploadUserData() //Update Rank in database
}
}
//MARK: TableView (Cell & Labels)
//Get Data of current cell that has been tapped
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let userIdentityString = generalRoomDataArr[indexPath.row].cellUserId
print("Uid of cell Data: " + userIdentityString!)
print("section: \(indexPath.section)")
print("row: \(indexPath.row)")
//1.) If imageView touch is deteected
//2.) Segua to new view controller by passing in the string UID(userIdentityString) of the cell
//3.) Get database information based on the UID that is added(look at prevous methods)
// -might have to call this function and use separeate function
//4.) Output data from database Users to represent a user profile
//All you have to do is pass a UID (Check other Database methods to send UID)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return generalRoomDataArr.count // your number of cell here
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
//Transform Data From ^ to load at the bottom
tableView.transform = CGAffineTransform (scaleX: 1,y: -1);
cell?.contentView.transform = CGAffineTransform (scaleX: 1,y: -1);
cell?.accessoryView?.transform = CGAffineTransform (scaleX: 1,y: -1);
//Set username label to display username
let usernameLabel = cell?.viewWithTag(1) as! UILabel
usernameLabel.text = generalRoomDataArr[indexPath.row].username
//Set message label to display message
// let messageLabel = cell?.viewWithTag(2) as! UILabel
// messageLabel.text = generalRoomDataArr[indexPath.row].message
// messageLabel.numberOfLines = 0
let messageLabel = cell?.viewWithTag(5) as! UITextView
messageLabel.text = generalRoomDataArr[indexPath.row].message
//initialize UI Profile Image
let imageView = cell?.viewWithTag(3) as! UIImageView
//Make Porfile Image Cirlce
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true
//Set timeStampLabel to current time AGO
let timeStampLabel = cell?.viewWithTag(4) as! UILabel
timeStampLabel.text = generalRoomDataArr[indexPath.row].timeStamp
timeStampLabel.numberOfLines = 0
//Loading and change of Usesrs profile image on chat cell
let userProfileChatImage = generalRoomDataArr[indexPath.row].photoURL
//Load profile image(on cell) with URL & Alamofire Library
let downloadURL = NSURL(string: userProfileChatImage!)
imageView.af_setImage(withURL: downloadURL as! URL)
return cell!
}
//MARK: KeyBoard close on return button
// Hide the keyboard when the return key pressed
func textFieldShouldReturn(_ messageTextField: UITextField) -> Bool {
messageTextField.resignFirstResponder()
return true
}
}//END CLASS
答案 0 :(得分:2)
设置textView的高度并将其作为NSLayoutConstraints连接到视图控制器,并通过textViewDidChange更新它。
请参阅以下代码,其中textViewHeight是NSLayoutConstraints
func textViewDidChange(_ textView: UITextView) {
let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
var newFrame = textView.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame;
textViewHeight.constant = newFrame.size.height
tableView.beginUpdates()
tableView.endUpdates()
}
答案 1 :(得分:1)
您是否尝试过更改textView委托方法的大小?也许是这样的:
func textViewDidChange(_ textView: UITextView) {
let currentOffset = tableView.contentOffset
UIView.setAnimationsEnabled(false)
tableView.beginUpdates()
tableView.endUpdates()
UIView.setAnimationsEnabled(true)
tableView.setContentOffset(currentOffset, animated: false)
}
我使用此代码调整用户在textview中输入的单元格高度。不确定它是否适用于您的目的,但要试一试。