質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1176閲覧

swift MessageKitについて

haox0312

総合スコア11

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/06/08 07:21

MessageKitのサンプルコードで勉強しているのですが、
ザーっとでいいのでここはこういう働きをしていると教えていただけると嬉しいです。

swift

1import UIKit 2import MessageKit 3import MessageInputBar 4 5class ViewController: MessagesViewController { 6 7 var messageList: [MockMessage] = [] 8 9 lazy var formatter: DateFormatter = { 10 let formatter = DateFormatter() 11 formatter.dateStyle = .medium 12 return formatter 13 }() 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 DispatchQueue.main.async { 19 // messageListにメッセージの配列をいれて 20 self.messageList = self.getMessages() 21 // messagesCollectionViewをリロードして 22 self.messagesCollectionView.reloadData() 23 // 一番下までスクロールする 24 self.messagesCollectionView.scrollToBottom() 25 } 26 27 messagesCollectionView.messagesDataSource = self 28 messagesCollectionView.messagesLayoutDelegate = self 29 messagesCollectionView.messagesDisplayDelegate = self 30 messagesCollectionView.messageCellDelegate = self 31 32 messageInputBar.delegate = self 33 messageInputBar.sendButton.tintColor = UIColor.lightGray 34 35 36 37 38 // メッセージ入力時に一番下までスクロール 39 scrollsToBottomOnKeyboardBeginsEditing = true // default false 40 maintainPositionOnKeyboardFrameChanged = true // default false 41 } 42 43 44 //サンプルメッセージ 45 func getMessages() -> [MockMessage] { 46 return [ 47 createMessage(text: "あ"), 48 createMessage(text: "い"), 49 createMessage(text: "う"), 50 createMessage(text: "え"), 51 createMessage(text: "お"), 52 createMessage(text: "か"), 53 createMessage(text: "き"), 54 createMessage(text: "く"), 55 createMessage(text: "け"), 56 createMessage(text: "こ"), 57 createMessage(text: "さ"), 58 createMessage(text: "し"), 59 createMessage(text: "すせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん"), 60 ] 61 } 62 63 func createMessage(text: String) -> MockMessage { 64 let attributedText = NSAttributedString(string: text, attributes: [.font: UIFont.systemFont(ofSize: 15), 65 .foregroundColor: UIColor.black]) 66 return MockMessage(attributedText: attributedText, sender: otherSender(), messageId: UUID().uuidString, date: Date()) 67 } 68 69 override func didReceiveMemoryWarning() { 70 super.didReceiveMemoryWarning() 71 } 72} 73 74extension ViewController: MessagesDataSource { 75 76 func currentSender() -> Sender { 77 return Sender(id: "123", displayName: "自分") 78 } 79 80 func otherSender() -> Sender { 81 return Sender(id: "456", displayName: "知らない人") 82 } 83 84 func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int { 85 return messageList.count 86 } 87 88 func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType { 89 return messageList[indexPath.section] 90 } 91 92 // メッセージの上に文字を表示 93 func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? { 94 if indexPath.section % 3 == 0 { 95 return NSAttributedString( 96 string: MessageKitDateFormatter.shared.string(from: message.sentDate), 97 attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 10), 98 NSAttributedString.Key.foregroundColor: UIColor.darkGray] 99 ) 100 } 101 return nil 102 } 103 104 // メッセージの上に文字を表示(名前) 105 func messageTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? { 106 let name = message.sender.displayName 107 return NSAttributedString(string: name, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption1)]) 108 } 109 110 // メッセージの下に文字を表示(日付) 111 func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? { 112 let dateString = formatter.string(from: message.sentDate) 113 return NSAttributedString(string: dateString, attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption2)]) 114 } 115} 116 117// メッセージのdelegate 118extension ViewController: MessagesDisplayDelegate { 119 120 // メッセージの色を変更(デフォルトは自分:白、相手:黒) 121 func textColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor { 122 return isFromCurrentSender(message: message) ? .white : .darkText 123 } 124 125 // メッセージの背景色を変更している(デフォルトは自分:緑、相手:グレー) 126 func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor { 127 return isFromCurrentSender(message: message) ? 128 UIColor(red: 69/255, green: 193/255, blue: 89/255, alpha: 1) : 129 UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1) 130 } 131 132 // メッセージの枠にしっぽを付ける 133 func messageStyle(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageStyle { 134 let corner: MessageStyle.TailCorner = isFromCurrentSender(message: message) ? .bottomRight : .bottomLeft 135 return .bubbleTail(corner, .curved) 136 } 137 138 // アイコンをセット 139 func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) { 140 // message.sender.displayNameとかで送信者の名前を取得できるので 141 // そこからイニシャルを生成するとよい 142 let avatar = Avatar(initials: "人") 143 avatarView.set(avatar: avatar) 144 } 145} 146 147 148// 各ラベルの高さを設定(デフォルト0なので必須) 149extension ViewController: MessagesLayoutDelegate { 150 151 func cellTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat { 152 if indexPath.section % 3 == 0 { return 10 } 153 return 0 154 } 155 156 func messageTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat { 157 return 16 158 } 159 160 func messageBottomLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat { 161 return 16 162 } 163} 164 165extension ViewController: MessageCellDelegate { 166 // メッセージをタップした時の挙動 167 func didTapMessage(in cell: MessageCollectionViewCell) { 168 print("Message tapped") 169 } 170} 171 172extension ViewController: MessageInputBarDelegate { 173 // メッセージ送信ボタンをタップした時の挙動 174 func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) { 175 for component in inputBar.inputTextView.components { 176 if let image = component as? UIImage { 177 178 let imageMessage = MockMessage(image: image, sender: currentSender(), messageId: UUID().uuidString, date: Date()) 179 messageList.append(imageMessage) 180 messagesCollectionView.insertSections([messageList.count - 1]) 181 182 } else if let text = component as? String { 183 184 let attributedText = NSAttributedString(string: text, attributes: [.font: UIFont.systemFont(ofSize: 15), 185 .foregroundColor: UIColor.white]) 186 let message = MockMessage(attributedText: attributedText, sender: currentSender(), messageId: UUID().uuidString, date: Date()) 187 messageList.append(message) 188 messagesCollectionView.insertSections([messageList.count - 1]) 189 } 190 } 191 inputBar.inputTextView.text = String() 192 messagesCollectionView.scrollToBottom() 193 } 194}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問