実現したいこと
画像とテキストの送信が可能なチャットアプリを作っています。LINEのように、画像を送信してもテキストを送信しても、バブル(セル)間の間隔が均等になるようにしたいです。具体的には、セルとセルの間は8ptで作成したいです。
###今の問題点
テキストを送信した時はセルとセルの間が設定した通りの間隔で空いてくれるが、画像を送信した時はセルとセルの間が非常に大きく空いてしまう。
##現状の実装
画像やテキストをFirebaseのDBにアップロードする部分のコード
Swift
1func retrieveMessages () { 2 3 let messagesDB = messageRef.child(userID!).child(chatMateInfo.uid).child("Messages") 4 messagesDB.observe(.childAdded) { (snapshot) in 5 6 guard let snapshotValue = snapshot.value as? Dictionary<String, String> else { return } 7 8 let dateStr = snapshotValue["date"]! 9 let formatter: DateFormatter = DateFormatter() 10 formatter.locale = Locale(identifier: "ja_JP") 11 formatter.dateFormat = "yyyy/MM/dd HH:mm:ss" 12 let formattedDate = formatter.date(from: dateStr)! 13 14 let message = MessageBox(senderUid: snapshotValue["senderUid"]!, date: formattedDate) 15 if let text = snapshotValue["text"] { 16 message.text = text 17 } else { 18 message.imageURL = snapshotValue["imageURL"]! 19 } 20 self.messageBox.append(message) 21 self.messageTableView.reloadData() 22 23 let bottomRow = NSIndexPath(row: (self.messageBox.count - 1), section: 0) 24 self.messageTableView.scrollToRow(at: 25 bottomRow as IndexPath, at: UITableView.ScrollPosition.bottom, animated: true) 26 } 27 }
セルの内容を決める部分のコード
Swift
1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 3 // 送信された時間に応じてソート 4 let sortedMessages = messageBox.sorted { (recentMessage: MessageBox, pastMessage: MessageBox) -> Bool in 5 pastMessage.date > recentMessage.date 6 } 7 let senderUid = sortedMessages[indexPath.row].senderUid 8 // テキストメッセージの場合 9 if let text = sortedMessages[indexPath.row].text { 10 let cell = tableView.dequeueReusableCell(withIdentifier: "chatCell", for: indexPath) as! ChatCell 11 cell.chatTextView.text = text 12 13 if senderUid == Auth.auth().currentUser?.uid { 14 cell.chatTextBubble.backgroundColor = UIColor.init(red: 250/255, green: 120/255, blue: 160/255, alpha: 1) 15 cell.chatStackView.alignment = .trailing 16 } else { 17 cell.chatTextBubble.backgroundColor = UIColor.init(red: 141/255, green: 226/255, blue: 213/255, alpha: 1) 18 cell.chatStackView.alignment = .leading 19 } 20 return cell 21 // 画像メッセージの場合 22 } else { 23 let cell = tableView.dequeueReusableCell(withIdentifier: "imageCell", for: indexPath) as! ImageCell 24 25 cell.chatImageView.contentMode = UIImageView.ContentMode.scaleAspectFit 26 cell.chatImageView?.sd_setShowActivityIndicatorView(true) 27 cell.chatImageView?.sd_setIndicatorStyle(.gray) 28 let typeChangedImageURL = URL(string: sortedMessages[indexPath.row].imageURL! ) 29 cell.chatImageView.sd_setImage(with: typeChangedImageURL) 30 if senderUid == Auth.auth().currentUser?.uid { 31 cell.imageStackView.alignment = .trailing 32 } else { 33 cell.imageStackView.alignment = .leading 34 } 35 36 return cell 37 } 38 }
###【追記】VIewのヒエラルキーとセルの大きさ
セルの背景色以下のようにピンク色に変えました
チャット画面のスクリーンショットです。セルが大きくなってしまっているようです
###【追記】heightForRowAtを試しました
このように書くか
Swift
1func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 2 messageTableView.estimatedRowHeight = 130 3 return UITableView.automaticDimension 4 }
このように書いてviewDidLoadとメッセージ取得のメソッドの中に書く
Swift
1func fixCellSize() { 2 messageTableView.rowHeight = UITableView.automaticDimension 3 messageTableView.estimatedRowHeight = 130 4 }
上記2つのパターンを試しましたが、どちらも立ち上げた瞬間はこのように表示されるのですが
下にスクロールする、もしくは新規のテキストメッセージを送信すると
また元のように画像のセルだけが大きくなってしまいます。
###その他の情報
開発環境:
Xcode 10.1
Swift 4.2.1
回答1件
あなたの回答
tips
プレビュー