【问题标题】:creating pagingmenucontroller with the view sliding in swift快速滑动视图创建分页菜单控制器
【发布时间】:2016-04-18 18:11:12
【问题描述】:

我正在创建一个聊天应用程序,其中有一些不同类别的预定义常见问题解答,当用户单击按钮时会向上滑动。以下是图像的外观:

[![最终输出]

我正在使用以下链接中的 PagingMenucontroller 库: https://github.com/kitasuke/PagingMenuController

我面临的问题是视图不占用设备的宽度。 uitableview 的滚动不起作用。 也只加载免费和业务部分的数据。

下面是 ChatViewcontroller 类的代码,它是上图所示的父类:

    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.
    }


}

以下是聊天问题视图控制器的代码,它连接到具有表格视图的 xib:

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
    }

}

还有 uitableview 的自定义单元格如下是代码:

import UIKit

class ChatCellView: UITableViewCell
{

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


}

我的输出如下图所示:

[![当前输出图像]

我也无法点击免费业务等类别名称。

很抱歉发了很长的帖子,但无法从过去 3 天找出解决方案。

更新: 上传故事板及其图层的屏幕截图

[![主情节提要]

【问题讨论】:

  • 我可以看看你在哪里实现了 UIPageViewController 的 Storyboard 吗?
  • 当然你可以帮我上传stryboard我怎么能在这里上传或者我应该截图然后上传??是否有上传整个故事板文件的规定?
  • 不!最好你可以显示截图,或者如果你上传项目以便我可以查看它会很好!
  • 抱歉,我正在使用 pagingmenucontroller 库是我的输入错误,我输入了错误的 pageviewcontroller。我正在动态创建所有内容并将其作为子视图添加到空白 uiview。故事板只有空白 uiview。你还想要截图我可以在这里上传
  • 可以上传吗?

标签: ios swift uitableview xcode7.1


【解决方案1】:

在这里,我对项目PagingMenuController 进行了更改,并根据您的需要创建了一个 UI。

这里是演示项目,你可以看看!

我做了什么?

我刚刚将ContainerView 的约束更改为您想要的特定高度。

并确保您已对其ChildViewController 给予适当的限制。

项目下载链接:https://www.dropbox.com/s/zili4l7yot7dnvo/Example.zip?dl=0

答案更新

如果你使用Autolayout那么你可以使用frame来改变约束,它肯定会导致错误。如果您想更改,则可以通过以下方式进行:

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

questionViewBottomConstraint.constant = -250.0

相应地更改约束值并查看差异。

如果您需要任何更改,请告诉我!

【讨论】:

  • 分页菜单控制器视图来自其设备视图下方,我正在更改 y 位置以使其向上滑动。可能是导致约束问题的原因吗?请提供演示链接,没有链接。
  • @NiranjanBalkrishnaPrajapati 请查看演示链接。我已经提供了!
  • 抱歉请假了几天我在编译项目时检查了演示出现错误。但是我将代码和 ib 与所有约束进行了比较,除了我的视图在运行时不在屏幕之外并且单击按钮时它会向上滑动之外,其他所有约束都相同。我认为这与可能导致表格行或表格视图不占用宽度的滑动有关。你能帮我修一下吗?
  • @NiranjanBalkrishnaPrajapati Bro 我明天会回来,我一定会帮助你
  • @NiranjanBalkrishnaPrajapati 请您将您的演示项目发给我,以便我编辑并发送给您!请使用最新的 Xcode 7.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多