3

I am creating a chat application where there are some predefined FAQ with different categories which will slide up when user clicks button. Following is the image how it should look :

[![final output]

I am using PagingMenucontroller library from following link: https://github.com/kitasuke/PagingMenuController

Issue i am facing is the view doesnt occupy the width of the device. the scrolling of uitableview doesnt work. also the data for free and business section only gets loaded.

Following is the class ChatViewcontroller code which is the parent class shown in image above:

    import Foundation
import UIKit
import PagingMenuController

class ChatViewController: UIViewController, UITextFieldDelegate//, UITableViewDelegate, UITableViewDataSource
{

    @IBOutlet var askQuestionTxtField: UITextField!
    @IBOutlet var bottomTypingView: UIView!

    @IBOutlet var bottomQuestionsView: UIView!
    @IBOutlet var chatView: UIView!
    var questionViewYPos:CGFloat = 0.0
    var keyboardFrame:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0)
    @IBOutlet var questionOpenBtn: UIButton!

    @IBOutlet var questionViewBottomConstraint: NSLayoutConstraint!
    var isQuestionViewOpen:Bool = false
    var isKeyboardVisible:Bool = false
    var timer = NSTimer()
    var questionCategoriesArray:[String] = ["FREE", "BUSINESS", "RELATIONSHIPS", "CAREER", "OTHERS"]
    var questionsDictionary:Dictionary<String,[String]> = [:]

    @IBAction func onQuestionViewBtnClick(sender: AnyObject)
    {
        if(isKeyboardVisible)
        {
            animateViewMoving(false, moveValue: questionViewYPos-bottomTypingView.frame.size.height)
            bottomQuestionsView.hidden = false
            askQuestionTxtField.resignFirstResponder()

            timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.4), target: self, selector: "openQuestionView", userInfo: nil, repeats: false)
        }
        else
        {
            isQuestionViewOpen = !isQuestionViewOpen
            print("isQuestionViewOpen",isQuestionViewOpen)
            print("bottomQuestionsView height :: ",bottomQuestionsView.frame.size.height)
            if(isQuestionViewOpen)
            {
                questionViewAnimation(true, moveValue: (questionViewYPos))
                animateViewMoving(true, moveValue: (questionViewYPos))
            }
            else
            {

                animateViewMoving(false, moveValue: (questionViewYPos))
            }
        }
    }

    func openQuestionView()
    {
        isQuestionViewOpen = !isQuestionViewOpen
        questionViewAnimation(true, moveValue: (questionViewYPos))
        animateViewMoving(true, moveValue: (questionViewYPos))
    }

    @IBAction func onFreeBtnClick(sender: AnyObject)
    {
        print("onFreeBtnClick")
    }
    @IBAction func onBusinessBtnClick(sender: AnyObject)
    {
        print("onBusinessBtnClick")
    }
    @IBAction func onRelationshipBtnClick(sender: AnyObject)
    {
        print("onRelationshipBtnClick")
    }
    @IBAction func onCareerBtnClick(sender: AnyObject)
    {
        print("onCareerBtnClick")
    }
    @IBAction func onOthersBtnClick(sender: AnyObject)
    {
        print("onOthersBtnClick")
    }
    var freeItems: [String] = ["What Shall I keep in mind about money 1", "Heart shall I keep in mind", "What shall I keep in mind about money \n matters today?","We keep in mind about money 2","We keep in mind about money 3", "We keep in mind about money 4", "Heart shall I keep in mind 2", "Heart shall I keep in mind 3"]

    var businessItems: [String] = ["What is my Business Future 1", "What is my Business Future 2", "What is my Business Future 3 \n and other matters today?","What is my Business Future 4","What is my Business Future 5", "What is my Business Future 6", "What is my Business Future 7", "What is my Business Future 8","What is my Business Future 9", "What is my Business Future 10"]

    var relationShipsItems: [String] = ["How Will be my RelationShip this Year 1", "How Will be my RelationShip this Year 2", "How Will be my RelationShip today \n and other matters","How Will be my RelationShip this Year 3","How Will be my RelationShip this week 4", "How Will be my RelationShip this Year 5", "How Will be my RelationShip this Year 6", "How Will be my RelationShip tomorrow 7", "How Will be my RelationShip this Year 8"]

    var careerItems: [String] = ["How will be my career 1", "How will be my career 2", "How will be my career 3","We keep in mind about money 2","How will be my career 4", "How will be my career 5", "How will be my career 6", "How will be my career 7","How will be my career 8","How will be my career 9","How will be my career 10","How will be my career 11","How will be my career 12","How will be my career 13", "How will be my career 14","How will be my career 15"]

    var otherItems: [String] = ["Other Future Related Questions 1", "Other Future Related Questions 2", "Other Future Related Questions 3", "Other Future Related Questions 4", "Other Future Related Questions 5", "Other Future Related Questions 6", "Other Future Related Questions 7", "Other Future Related Questions 8", "Other Future Related Questions 9", "Other Future Related Questions 10", "Other Future Related Questions 11", "Other Future Related Questions 12", "Other Future Related Questions 13", "Other Future Related Questions 14", "Other Future Related Questions 15", "Other Future Related Questions 16", "Other Future Related Questions 17", "Other Future Related Questions 18", "Other Future Related Questions 19", "Other Future Related Questions 20"]
    var questionsVariableArray:[[String]]!

    override func viewDidLoad() {
        super.viewDidLoad()
        //NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardDidShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
        bottomQuestionsView.userInteractionEnabled = true
        askQuestionTxtField.delegate = self
        questionViewYPos = self.chatView.frame.size.height-(self.chatView.frame.size.height - bottomQuestionsView.frame.size.height)
        print("bottomQuestionsView.frame.origin.y",bottomQuestionsView.frame.origin.y)
        print("pos :: ",questionViewYPos)

        self.questionsVariableArray  = [self.freeItems, self.businessItems, self.relationShipsItems, self.careerItems, self.otherItems]
        print("self.questionsVariableArray  ::",self.questionsVariableArray )
        print("self.freeItems  ::",self.freeItems)
        print("self.businessItems  ::",self.businessItems)
        print("self.relationShipsItems  ::",self.relationShipsItems )
        print("self.careerItems  ::",self.careerItems )
        print("self.otherItems  ::",self.otherItems )

        createQuestionsDictionary()

    }

    func createQuestionsDictionary()
    {
        for(var i:Int = 0;i < self.questionCategoriesArray.count; i++)
        {
            print("self.questionCategoriesArray[i] :: ",self.questionCategoriesArray[i])
            print("self.questionsVariableArray[i] :: ",self.questionsVariableArray[i])
            questionsDictionary[self.questionCategoriesArray[i]] = self.questionsVariableArray[i]
        }

        print("questionsDictionary :: ",questionsDictionary)
        loadCategoriesQuestionsView()
    }

    func loadCategoriesQuestionsView()
    {
        var viewControllersArray:[ChatQuestionsViewController] = []
        /*for(var i:Int = 0; i < self.questionCategoriesArray.count; i++)
        {
            let _viewController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

            _viewController.title = self.questionCategoriesArray[i]
            Constants.questionCategoriesArray = self.questionCategoriesArray
            Constants.questionsDictionary = self.questionsDictionary

            _viewController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[i])
            viewControllersArray.append(_viewController)
            _viewController.view.translatesAutoresizingMaskIntoConstraints = true
        }*/

        let _freeviewController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

        _freeviewController.title = self.questionCategoriesArray[0]
        Constants.questionCategoriesArray = self.questionCategoriesArray
        Constants.questionsDictionary = self.questionsDictionary

        viewControllersArray.append(_freeviewController)
        //_freeviewController.view.translatesAutoresizingMaskIntoConstraints = true

        let _businessviewController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

        _businessviewController.title = self.questionCategoriesArray[1]
        Constants.questionCategoriesArray = self.questionCategoriesArray
        Constants.questionsDictionary = self.questionsDictionary

        viewControllersArray.append(_businessviewController)
        //_freeviewController.view.translatesAutoresizingMaskIntoConstraints = true

        let _relationshipController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

        _relationshipController.title = self.questionCategoriesArray[2]
        Constants.questionCategoriesArray = self.questionCategoriesArray
        Constants.questionsDictionary = self.questionsDictionary

        viewControllersArray.append(_relationshipController)
        //_freeviewController.view.translatesAutoresizingMaskIntoConstraints = true

        let _careerController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

        _careerController.title = self.questionCategoriesArray[3]
        Constants.questionCategoriesArray = self.questionCategoriesArray
        Constants.questionsDictionary = self.questionsDictionary

        viewControllersArray.append(_careerController)
        //_freeviewController.view.translatesAutoresizingMaskIntoConstraints = true

        let _otherController = ChatQuestionsViewController.init(nibName: "ChatQuestionsViewController", bundle: nil)

        _otherController.title = self.questionCategoriesArray[4]
        Constants.questionCategoriesArray = self.questionCategoriesArray
        Constants.questionsDictionary = self.questionsDictionary

        viewControllersArray.append(_otherController)
        //_freeviewController.view.translatesAutoresizingMaskIntoConstraints = true



        let options = PagingMenuOptions()
        options.menuItemMargin = 5
        //options.menuDisplayMode = .SegmentedControl
        let pagingMenuController = PagingMenuController(viewControllers: viewControllersArray , options: options)
        self.addChildViewController(pagingMenuController)
        self.bottomQuestionsView.addSubview(pagingMenuController.view)

        //self.bottomQuestionsView.translatesAutoresizingMaskIntoConstraints = true
        //self.bottomQuestionsView.translatesAutoresizingMaskIntoConstraints = true
        pagingMenuController.didMoveToParentViewController(self)

        if _freeviewController.isViewLoaded()
        {
            // viewController is visible
            _freeviewController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[0])
            //_freeviewController.chatTableView.reloadData()
        }
        if _businessviewController.isViewLoaded()
        {
            // viewController is visible
            _businessviewController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[1])
            //_businessviewController.chatTableView.reloadData()

        }
        if _relationshipController.isViewLoaded()
        {
            // viewController is visible
            _relationshipController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[2])
            //_relationshipController.chatTableView.reloadData()
        }
        if _careerController.isViewLoaded()
        {
            // viewController is visible
            _careerController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[3])
            //_careerController.chatTableView.reloadData()
        }
        if _otherController.isViewLoaded()
        {
            // viewController is visible
            _otherController.setQuestionsCategoryArray(self.questionCategoriesArray, _questionsDictionary: self.questionsDictionary, _categoryName: self.questionCategoriesArray[4])
            //_otherController.chatTableView.reloadData()
        }
    }

    func textFieldDidBeginEditing(textField: UITextField)
    {
        print("keyboardFrame.size.height",self.view.frame.origin.y)
        //animateViewMoving(true, moveValue: questionViewYPos-bottomTypingView.frame.size.height)

        if(self.view.frame.origin.y < 0.0)
        {
            animateViewMoving(false, moveValue: (questionViewYPos))
            timer = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.4), target: self, selector: "update", userInfo: nil, repeats: false)
            isQuestionViewOpen = !isQuestionViewOpen
            print("isQuestionViewOpen ###",isQuestionViewOpen)
        }
        else
        {
            animateViewMoving(true, moveValue: questionViewYPos-bottomTypingView.frame.size.height)
            bottomQuestionsView.hidden = true
        }


    }
    func update() {
        // Something cool
        animateViewMoving(true, moveValue: questionViewYPos-bottomTypingView.frame.size.height)
         bottomQuestionsView.hidden = true
    }

    func textFieldDidEndEditing(textField: UITextField)
    {
        //animateViewMoving(false, moveValue: questionViewYPos-bottomTypingView.frame.size.height)
        textField.resignFirstResponder()
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool
    {
        //isQuestionViewOpen = !isQuestionViewOpen
        animateViewMoving(false, moveValue: questionViewYPos-bottomTypingView.frame.size.height)
        bottomQuestionsView.hidden = false
        //bottomQuestionsView.translatesAutoresizingMaskIntoConstraints = true
        textField.resignFirstResponder()

        return true
    }

    /*func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return self.freeItems.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        //var cell:UITableViewCell = self.chatTableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell
        let cellIdentifier = "cell"
        let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ChatCellView

        let cellTxtString = freeItems[indexPath.row]

        cell.questionNoLbl.text = String(indexPath.row + 1)
        cell.questionLbl.text = cellTxtString
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
    {

    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }*/

    func animateViewMoving (up:Bool, moveValue :CGFloat){
        let movementDuration:NSTimeInterval = 0.3
        let movement:CGFloat = ( up ? -moveValue : moveValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration )
        self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
        UIView.commitAnimations()
    }

    func questionViewAnimation(up:Bool, moveValue: CGFloat)
    {
        let movementDuration:NSTimeInterval = 0.3
        let movement:CGFloat = ( up ? -moveValue : moveValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration )
        self.bottomQuestionsView.frame = CGRectOffset(self.bottomQuestionsView.frame, 0,  movement)

        UIView.commitAnimations()
    }


    func keyboardWillShow(notification: NSNotification) {
        keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        print("keyboardFrame",keyboardFrame.height)
        isKeyboardVisible = true
        // do stuff with the frame...
    }

    func keyboardWillHide(notification: NSNotification) {
        keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        print("keyboardFrame",keyboardFrame.height)
        isKeyboardVisible = false
        // do stuff with the frame...
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

following is the code for chat question view controller which is connected to xib having the table view:

import UIKit
class ChatQuestionsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{   
    @IBOutlet var chatTableView: UITableView!

    var categoryArray:[String]!
    var categoryName:String = ""
    var questionsDictionary:Dictionary<String,[String]> = [:]
    var categoryQuestion:[String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        print("self.chatTableView :: ",chatTableView)

        self.chatTableView.registerNib(UINib(nibName: "ChatQuestionCellRowView", bundle: nil), forCellReuseIdentifier: "cell")

        self.categoryArray = Constants.questionCategoriesArray
        self.questionsDictionary = Constants.questionsDictionary

        self.view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]

    }
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

    }


    func setQuestionsCategoryArray(_categoryArray: [String], _questionsDictionary:Dictionary<String,[String]>, _categoryName:String)
    {
        //self.categoryArray = _categoryArray
        self.categoryName = _categoryName
        //self.questionsDictionary = _questionsDictionary
        //self.chatTableView.delegate = self
        //self.chatTableView.dataSource = self
        self.chatTableView.reloadData()
    }

    // MARK: - UITableViewDataSource

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print("self.categoryName :: ",self.categoryName)
        if self.categoryName == ""
        {
            return 0
        }
        else
        {
            categoryQuestion = self.questionsDictionary[self.categoryName]!
            print("categoryQuestion count :: ",categoryQuestion.count)
            return categoryQuestion.count
        }

    }

    // MARK: - UITableViewDelegate

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ChatCellView

        //let repository = self.categoryArray[indexPath.row]
        cell.questionNoLbl.text = String(indexPath.row)
        cell.questionLbl.text = categoryQuestion[indexPath.row]
        //cell.questionLbl.text = repository["name"] as? String
        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        /*let detailViewController = storyboard?.instantiateViewControllerWithIdentifier("DetailViewController") as! DetailViewController
        navigationController?.pushViewController(detailViewController, animated: true)*/
    }

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return true
    }

}

also there is custom cell for uitableview following is the code:

import UIKit

class ChatCellView: UITableViewCell
{

    @IBOutlet var questionNoLbl: UILabel!
    @IBOutlet var questionLbl: UILabel!


}

my output looks like following image:

[![current output image]

I am also not able to click on the category names like free business etc.

Sorry for long post but not able to figure out the solution from last 3 days.

UPDATE: Uploading screenshot of storyboard and its layers

[![main Storyboard]

1 Answers1

3

Here I have made changes to the project PagingMenuController and created a UI as you wants.

enter image description here

Here is the demo project which you can check it out!

What I have done?

I have just changed the constraints of the ContainerView to specific height as you want.

And make sure that you have given proper constraints to it's ChildViewController.

Project download link: https://www.dropbox.com/s/zili4l7yot7dnvo/Example.zip?dl=0

Answer Update

If you are using Autolayout then you can use frame to change the constraint, it will surely lead to error. If you can want to change then you can do it by following way:

questionViewBottomConstraint.constant = 250.0 //any value (here you can use `UITableView` height)

OR

questionViewBottomConstraint.constant = -250.0

Change the constraint value accordingly and see the difference.

Let me know, if any changes you want!

Sohil R. Memon
  • 9,404
  • 1
  • 31
  • 57
  • the pagingmenucontroller view is coming from below its out of device view i am changing the y position to make it slide up. may be that causing the issue with constraints ? Please provide link for demo there is no link. – Niranjan Balkrishna Prajapati Jan 18 '16 at 09:40
  • @NiranjanBalkrishnaPrajapati Please check the link for the demo. I have already provided! – Sohil R. Memon Jan 22 '16 at 08:57
  • sorry was on leave for some days i checked the demo getting error while compiling project. but i compared the code and ib with all the constraints and all its same except that my view is out of screen at runtime and upon button click it slides up. I think it has something to do with the sliding which might be causing the table rows or tabeleview to not occupy the width. can you help me fix it ? – Niranjan Balkrishna Prajapati Jan 22 '16 at 15:40
  • @NiranjanBalkrishnaPrajapati Bro I will back by tomorrow and I will surely help you out – Sohil R. Memon Jan 24 '16 at 05:47
  • @NiranjanBalkrishnaPrajapati Please can you please send me your demo project so that I can edit it and send to you! And please use latest Xcode 7.2 – Sohil R. Memon Jan 24 '16 at 05:49
  • @NiranjanBalkrishnaPrajapati the constraint is making issue, I can see your code, let me update the answer. – Sohil R. Memon Jan 24 '16 at 05:51
  • @NiranjanBalkrishnaPrajapati Please check the updated answer. If still problem persists give me tomorrow time as of now I am out of town really sorry! – Sohil R. Memon Jan 24 '16 at 05:55
  • @SohilR.Memon. I am facing an issue with paging menu controller in swift 3. I am unable to set y position from storyboard. Can u guide me how to achieve this – Uma Madhavi May 03 '17 at 06:20
  • @UmaMadhavi Which library are you using? – Sohil R. Memon May 03 '17 at 06:23
  • @UmaMadhavi Can you please share a screenshot of what you want to do? – Sohil R. Memon May 03 '17 at 06:33
  • @SohilR.Memon. this is the screenshot http://tinypic.com/r/dhcwog/9 from this i want to scroll pagingmenu. I had set position of pagingmenu programatically but unable to scroll. – Uma Madhavi May 03 '17 at 06:42
  • @UmaMadhavi can you pls show me your code what you have done till now or you can create a demo and submit on dropbox. – Sohil R. Memon May 03 '17 at 07:18