1

Text bubble only allow 2character then create a new line break for the next 2 characters. this will happen randomly. I did not make any adjustments to the bubble characters it just appears like that. Thank you in advance for the help

enter image description here

  import UIKit
import JSQMessagesViewController
import MobileCoreServices
import AVKit
import Firebase
import Braintree

class messagesViewController: JSQMessagesViewController {
    //braintree info

    var braintreeClient: BTAPIClient?
    var clientToken = String()
    var formInfo = [String: AnyObject]()



    // this is the id of the post id number
    var previousViewMessageId:String!
 )
    var messages = [JSQMessage]()
    //ref to retrieve message
    var messageRef:FIRDatabaseReference! //

    override func viewDidLoad() {
        super.viewDidLoad()


        //braintreeSetup()
        navBar()
        // tappedMyPayButton()

        self.messageRef = fireBaseAPI().childRef("version_one/frontEnd/post/\(previousViewMessageId)")

        let currentUser = fireBaseAPI().currentUserId()
        self.senderId = currentUser
        self.senderDisplayName = ""
        let ref = fireBaseAPI().ref()
        let messagRef = ref.child("version_one/frontEnd/post/\(previousViewMessageId)messages")

        // messagRef.childByAutoId().setValue("first Message")

        messagRef.observeEventType(.ChildAdded, withBlock: {snapshot in
            //if let dict = snapshot.value as? String {
            //}



        })


        observerveMessages()

    }

}

extension messagesViewController {

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.messages.count
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! {
        let data = self.messages[indexPath.row]      
        return data
    }


    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell

        return cell

    }
    override func collectionView(collectionView: JSQMessagesCollectionView!, didDeleteMessageAtIndexPath indexPath: NSIndexPath!) {
        self.messages.removeAtIndex(indexPath.row)
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! {

        let bubbleFactory = JSQMessagesBubbleImageFactory()

        let message = messages[indexPath.item]

        if message.senderId == self.senderId {

            return bubbleFactory.outgoingMessagesBubbleImageWithColor(UIColor(r: 43, g: 216, b: 225))
        }else{

            return bubbleFactory.incomingMessagesBubbleImageWithColor(UIColor(r: 125, g: 125, b: 125))   
        }       
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! {

        return nil
    }
}

//MARK - image

extension messagesViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate {

    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: NSDate!) {

        let newMessage = messageRef.child("messages")

        let messageData = ["text":text,"senderId":senderId,"senderDisplayName":senderDisplayName, "mediaType":"TEXT"]

        newMessage.childByAutoId().setValue(messageData)


        self.finishSendingMessage()       
    }

    func observerveMessages(){
        let obRef = fireBaseAPI().childRef("version_one/frontEnd/post/\(previousViewMessageId)/messages")
        obRef.observeEventType(.ChildAdded, withBlock: {snapshot in
            //


            if let dict = snapshot.value as? [String:AnyObject]{
                let mediaType = dict["mediaType"] as! String
                let senderId = dict["senderId"] as! String
                let senderName = dict["senderDisplayName"] as! String


                switch mediaType {
                case "TEXT":
                    let text = dict["text"] as? String

                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, text: text))


                case "PHOTO":
                    let fileUrl = dict["fileUrl"] as! String
                    let url = NSURL(string: fileUrl)
                    let data = NSData(contentsOfURL: url!)
                    let picture = UIImage(data: data!)
                    let photo = JSQPhotoMediaItem(image: picture!)

                    self.messages.append(JSQMessage(senderId: senderId,displayName: senderName, media: photo))

                    if self.senderId == senderId {
                        photo.appliesMediaViewMaskAsOutgoing = true

                    }else{
                        photo.appliesMediaViewMaskAsOutgoing = false
                    }


                case "VIDEO":
                    let fileUrl = dict["fileUrl"] as! String
                    let video = NSURL(string: fileUrl)
                    let videoItem = JSQVideoMediaItem(fileURL: video, isReadyToPlay: true)
                    self.messages.append(JSQMessage(senderId: senderId,displayName:senderName,media: videoItem))

                    if self.senderId == senderId {
                        videoItem.appliesMediaViewMaskAsOutgoing = true

                    }else{
                        videoItem.appliesMediaViewMaskAsOutgoing = false
                    }

                default :
                    print("Unknown data")
                }
                self.collectionView.reloadData()

            }


        })

    }

    override func didPressAccessoryButton(sender: UIButton!) {


        let sheet = UIAlertController(title: "Media Messages", message: "Please select an images", preferredStyle: .ActionSheet)
        let cancel = UIAlertAction(title: "Cancel", style: .Cancel) { (alert) in


        }
        let photoLibrary = UIAlertAction(title: "Photo Library", style: .Default) { (alert) in
            self.getMediafrom(kUTTypeImage)

        }
        let VideoLibrary = UIAlertAction(title: "Video Library", style: .Default) { (alert) in

            self.getMediafrom(kUTTypeMovie)
        }

        sheet.addAction(photoLibrary)
        sheet.addAction(VideoLibrary)
        sheet.addAction(cancel)

        self.presentViewController(sheet, animated: true, completion: nil)

        //        let imagePicker = UIImagePickerController()
        //        imagePicker.delegate = self
        //        self.presentViewController(imagePicker, animated: true, completion: nil)
        //

    }

    func getMediafrom(type:CFString){
        let mediaPicker = UIImagePickerController()
        mediaPicker.delegate = self
        mediaPicker.mediaTypes = [type as String]

        self.presentViewController(mediaPicker, animated: true, completion: nil)



    }
    // Display video message
    override  func collectionView(collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAtIndexPath indexPath: NSIndexPath!) {

        let message = messages[indexPath.item]
        if message.isMediaMessage {

            if let mediaItem = message.media as? JSQVideoMediaItem{
                let player = AVPlayer(URL: mediaItem.fileURL)
                let playerViewController = AVPlayerViewController()
                playerViewController.player = player

                self.presentViewController(playerViewController, animated: true, completion: nil)

            }
        }

    }
    func sendMedia(picture:UIImage?,video: NSURL?){


        let filePath = "frontEnd/users/\(fireBaseAPI().currentUserId()!)/images/\(NSDate.timeIntervalSinceReferenceDate())/"

        if let picture = picture{

            let data = UIImageJPEGRepresentation(picture, 0.1)
            let metaData = FIRStorageMetadata()
            metaData.contentType = "image/jpg"
            FIRStorage.storage().reference().child(filePath).putData(data!, metadata: metaData) { (metaData, error) in
                if error != nil {
                    print(error)
                    return
                }

                let fileUrl =  metaData?.downloadURLs![0].absoluteString
                let newMessage = self.messageRef.child("messages")


                let messageData = ["fileUrl":fileUrl,"senderId":self.senderId,"senderDisplayName":self.senderDisplayName, "mediaType":"PHOTO"]

                newMessage.childByAutoId().setValue(messageData)



            }


        }else if let video = video{

            let data = NSData(contentsOfURL: video)
            let metaData = FIRStorageMetadata()
            metaData.contentType = "video/mp4"
            FIRStorage.storage().reference().child(filePath).putData(data!, metadata: metaData) { (metaData, error) in
                if error != nil {
                    print(error)
                    return
                }

                let fileUrl =  metaData?.downloadURLs![0].absoluteString
                let newMessage = self.messageRef.child("messages")

                let messageData = ["fileUrl":fileUrl,"senderId":self.senderId,"senderDisplayName":self.senderDisplayName, "mediaType":"VIDEO"]

                newMessage.childByAutoId().setValue(messageData)



            }


        }

    }

    //photothe
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

        if let picture = info[UIImagePickerControllerOriginalImage] as? UIImage{
            //   let photo = JSQPhotoMediaItem(image: picture)
            ////  messages.append(JSQMessage(senderId: senderId,displayName: senderDisplayName,media: photo))
            sendMedia(picture,video:nil)

        }else if let video = info[UIImagePickerControllerMediaURL] as? NSURL {
            //            let videoItem = JSQVideoMediaItem(fileURL: video, isReadyToPlay: true)
            //            messages.append(JSQMessage(senderId: senderId,displayName:senderDisplayName,media: videoItem))

            sendMedia(nil, video: video)
        }






        self.dismissViewControllerAnimated(true, completion: nil)
        collectionView.reloadData()

    }

}
extension messagesViewController{

    func dismissVc(){
        self.dismissViewControllerAnimated(true, completion: nil)
    }
    //button setup

}
// button Actions
J. Allan
  • 1,418
  • 1
  • 12
  • 23
SwiftER
  • 1,235
  • 4
  • 17
  • 40
  • 1
    I'm not sure if you're describing the *problem* or what you *want* to happen. Furthermore, I don't see any code that shows what you've done so far. – J. Allan Sep 09 '16 at 19:13
  • @JefréN. I do not want this to happen. It would randomly happen I added the code to the question. Thank you in advance – SwiftER Sep 09 '16 at 19:31
  • What do you want? Do you only want 1 character per line? – J. Allan Sep 09 '16 at 19:32
  • @JefréN. I do not want to limit the character I just want the message to look normal by normal I mean all the way to the edge of the screen until theres no more text to display. I also upvote your comment. Thank you for the help. – SwiftER Sep 09 '16 at 19:41
  • I'm guessing you have to set the width of the message box, somehow. (I can't give any specific help since I've never used this library. However, I'm thinking you need to specify the width of the text box somehow.) – J. Allan Sep 09 '16 at 19:52
  • How are you presenting this view? – Dan Leonard Sep 11 '16 at 20:46
  • It is done using a library call `pod 'JSQMessagesViewController'` – SwiftER Sep 11 '16 at 21:31

0 Answers0