Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import UIKit
- import MessageKit
- import AVFoundation
- let senders: [Sender] = [Sender(id: "283476", displayName: "Bogdan Bystritskiy"),
- Sender(id: "34556", displayName: "Valeria Ryabinicheva")
- ]
- var messages: [MockMessage] = [
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-1505284,
- text: "Dealing With Technical Support 10 Useful Tips"),
- MockMessage(sender: senders[1], messageId: senders[1].id, date: Date()-360364,
- text: "Are You Ready To Buy A Home Theater Audio System"),
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-3600,
- text: "Motivation And Your Personal Vision An Unbeatable Force"),
- MockMessage(sender: senders[1], messageId: senders[1].id, date: Date(), emoji: "😜"),
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-3600,
- text: "Are You Ready To Buy A Home Theater Audio System"),
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-3600,
- text: "Motivation And Your Personal Vision An Unbeatable Force"),
- MockMessage(sender: senders[1], messageId: senders[1].id, date: Date()-3600,
- text: "Are You Ready To Buy A Home Theater Audio System"),
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-3600,
- text: "Dealing With Technical Support 10 Useful Tips"),
- MockMessage(sender: senders[0], messageId: senders[0].id, date: Date()-3600,
- text: "Motivation And Your Personal Vision An Unbeatable Force"),
- MockMessage(sender: senders[1], messageId: senders[1].id, date: Date(), emoji: "🤯")
- ]
- class ChatDetailViewController: MessagesViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
- var imagePicker = UIImagePickerController()
- lazy var formatter: DateFormatter = {
- let formatter = DateFormatter()
- formatter.dateStyle = .medium
- return formatter
- }()
- override func viewDidLoad() {
- super.viewDidLoad()
- configureNavigationBar()
- configureMessageView()
- hideKeyboardWhenTappedAround()
- // imagePicker.delegate = self
- DispatchQueue.main.async {
- self.messagesCollectionView.reloadData()
- self.messagesCollectionView.scrollToBottom()
- }
- }
- func hideKeyboardWhenTappedAround() {
- let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
- tapGestureRecognizer.cancelsTouchesInView = false
- messagesCollectionView.addGestureRecognizer(tapGestureRecognizer)
- }
- @objc func dismissKeyboard() {
- messageInputBar.inputTextView.resignFirstResponder()
- }
- func configureMessageView() {
- messagesCollectionView.messagesDataSource = self
- messagesCollectionView.messagesLayoutDelegate = self
- messagesCollectionView.messagesDisplayDelegate = self
- messageInputBar.delegate = self
- messagesCollectionView.backgroundColor = .twPaleGray
- maintainPositionOnKeyboardFrameChanged = true
- scrollsToBottomOnKeybordBeginsEditing = true
- messageInputBar.inputTextView.placeholder = "Напишите сообщение..."
- messageInputBar.sendButton.configure { (button) in
- button.image = UIImage(named: "sendButton")
- button.title = nil
- }
- let leftButton = InputBarButtonItem()
- leftButton.setImage(UIImage(named: "clip"), for: .normal)
- leftButton.addTarget(self, action: #selector(addMedia), for: .allTouchEvents)
- messageInputBar.setStackViewItems([leftButton], forStack: .left, animated: false)
- leftButton.snp.makeConstraints { (make) in
- make.centerY.equalTo(messageInputBar.sendButton.snp.centerY)
- }
- messageInputBar.setLeftStackViewWidthConstant(to: leftButton.intrinsicContentSize.width + 15, animated: false)
- if let img = UIImage(named: "oval") {
- messages.append(MockMessage(sender: currentSender(), messageId: currentSender().id, date: Date(), photo: img))
- }
- }
- @objc func addMedia() {
- if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
- print("Button capture")
- imagePicker.delegate = self
- imagePicker.sourceType = .photoLibrary
- imagePicker.allowsEditing = false
- self.present(imagePicker, animated: true, completion: nil)
- }
- }
- func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {
- if let image = info[UIImagePickerControllerLivePhoto] as? UIImage {
- messages.append(MockMessage(sender: currentSender(), messageId: currentSender().id, date: Date(), photo: image))
- picker.dismiss(animated: true, completion: nil)
- }
- // picker.dismiss(animated: true, completion: nil)
- }
- func configureNavigationBar() {
- if #available(iOS 11.0, *) {
- navigationController?.navigationBar.prefersLargeTitles = false
- }
- navigationController?.navigationBar.barTintColor = .twBlue
- navigationController?.navigationBar.tintColor = .white
- navigationItem.title = "Островский"
- if let chatImage = UIImage(named: "oval") {
- navigationItem.rightBarButtonItem = UIBarButtonItem(image: chatImage, style: .plain, target: self, action: nil)
- }
- }
- }
- extension ChatDetailViewController: MessagesDataSource {
- func numberOfMessages(in messagesCollectionView: MessagesCollectionView) -> Int {
- return messages.count
- }
- func currentSender() -> Sender {
- return Sender(id: "34556", displayName: "Valeria Ryabinicheva")
- }
- func numberOfSections(in messagesCollectionView: MessagesCollectionView) -> Int {
- return messages.count
- }
- func messageForItem(at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageType {
- return messages[indexPath.section]
- }
- func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
- let string = message.sender.displayName
- if message.sender != currentSender() {
- return NSAttributedString(string: string, attributes: [NSAttributedStringKey.foregroundColor: UIColor.twBlue,
- NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12)])
- }
- return nil
- }
- func cellBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
- let date = formatter.string(from: message.sentDate)
- return NSAttributedString(string: date, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 10),
- NSAttributedStringKey.foregroundColor: UIColor.twLightGray])
- }
- }
- extension ChatDetailViewController: MessagesLayoutDelegate {
- func heightForLocation(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
- return 100
- }
- func cellBottomLabelAlignment(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> LabelAlignment {
- return .messageTrailing(.zero)
- }
- func widthForMedia(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
- return (view.frame.width / 3) * 2
- }
- func heightForMedia(message: MessageType, at indexPath: IndexPath, with maxWidth: CGFloat, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
- return (view.frame.width / 3) * 2
- }
- }
- extension ChatDetailViewController: MessagesDisplayDelegate {
- func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
- if let firstCharacter = message.sender.displayName.first {
- let initials = String(firstCharacter)
- avatarView.initials = initials
- }
- }
- func backgroundColor(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> UIColor {
- switch message.data {
- case .emoji:
- return .clear
- case .photo:
- return .clear
- default:
- guard let dataSource = messagesCollectionView.messagesDataSource else { return .white }
- return dataSource.isFromCurrentSender(message: message) ? UIColor.twBlue : UIColor.white
- }
- }
- }
- extension ChatDetailViewController: MessageInputBarDelegate {
- func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) {
- for component in inputBar.inputTextView.components {
- if let image = component as? UIImage {
- let imageMessage = MockMessage(sender: currentSender(), messageId: currentSender().id, date: Date(), photo: image)
- messages.append(imageMessage)
- messagesCollectionView.insertSections([messages.count - 1])
- } else if let text = component as? String {
- let attributedText = NSAttributedString(string: text, attributes: [.font: UIFont.systemFont(ofSize: 15), .foregroundColor: UIColor.blue])
- let message = MockMessage(sender: currentSender(), messageId: currentSender().id, date: Date(), attributedText: attributedText)
- messages.append(message)
- messagesCollectionView.insertSections([messages.count - 1])
- }
- }
- inputBar.inputTextView.text = String()
- messagesCollectionView.scrollToBottom()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement