我正在创建一个聊天应用程序,其中有一些预定义的常见问题解答,其中包含不同的类别,当用户点击按钮以下是图片的外观:
[![最终输出]
我正在使用以下链接中的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天的解决方案。
更新: 正在上传storyboard及其图层的屏幕截图
[![主要故事板]
答案 0 :(得分:3)
在这里,我对项目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)
OR
questionViewBottomConstraint.constant = -250.0
相应地更改约束值并查看差异。
如果有任何改变,请告诉我们!