Ios CollectionView单元隐藏在元素后面

Ios CollectionView单元隐藏在元素后面,ios,swift,xcode,scroll,uicollectionview,Ios,Swift,Xcode,Scroll,Uicollectionview,我正在制作这个聊天应用程序,我有一个问题,希望有人能帮我解决。在您可以看到的图像中,我有一个聊天室中所有消息的收集视图,这里的问题是,还有一条消息您无法在图像中看到,因为它隐藏在输入文本和按钮后面。如果我按住鼠标向下滚动,我可以看到它,但当我放开它时,它会反弹回我看不到最后一条消息的位置。我不知道问题是什么,所以我真的不知道该与您共享什么代码,但也许您知道问题可能是什么,以及必须修复代码的哪一部分 图像: 编辑:约束代码: private func setupInputComponents()

我正在制作这个聊天应用程序,我有一个问题,希望有人能帮我解决。在您可以看到的图像中,我有一个聊天室中所有消息的收集视图,这里的问题是,还有一条消息您无法在图像中看到,因为它隐藏在输入文本和按钮后面。如果我按住鼠标向下滚动,我可以看到它,但当我放开它时,它会反弹回我看不到最后一条消息的位置。我不知道问题是什么,所以我真的不知道该与您共享什么代码,但也许您知道问题可能是什么,以及必须修复代码的哪一部分

图像:

编辑:约束代码:

private func setupInputComponents()
{
    let topBorderView = UIView()
    topBorderView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

    messageInputContainerView.addSubview(inputTextField)
    messageInputContainerView.addSubview(sendButton)
    messageInputContainerView.addSubview(topBorderView)

    messageInputContainerView.addConstraintsWithFormat(format: "H:|-8-[v0][v1(60)]|", views: inputTextField, sendButton)
    messageInputContainerView.addConstraintsWithFormat(format: "V:|[v0]|", views: inputTextField)
    messageInputContainerView.addConstraintsWithFormat(format: "V:|[v0]|", views: sendButton)

    messageInputContainerView.addConstraintsWithFormat(format: "H:|[v0]|", views: topBorderView)
    messageInputContainerView.addConstraintsWithFormat(format: "V:|[v0(0.5)]", views: topBorderView)
}
此外,这在viewDidLoad中:

    view.addSubview(messageInputContainerView)
    view.addConstraintsWithFormat(format: "H:|[v0]|", views: messageInputContainerView)
    view.addConstraintsWithFormat(format: "V:[v0(48)]", views: messageInputContainerView)

    bottomConstraint = NSLayoutConstraint(item: messageInputContainerView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
    view.addConstraint(bottomConstraint!)

    setupInputComponents()

下面是添加文本视图和按钮作为viewcontroller附件视图的更好解决方案

若你们看过ios的本机消息应用程序,你们可以用互动的滑动手势关闭键盘。 这样,您的问题也将得到解决,因为我们不会将textview和button作为子视图添加到uiview,它将作为视图控制器的附件视图使用

步骤1:(可选)

转到Storyboard选择集合视图,并在属性列表上更改键盘关闭模式以交互方式关闭

并使您的集合视图填满整个屏幕(不要为文本字段和发送按钮添加空间)

步骤2:

在视图控制器中,在顶部添加以下属性

var viewAcc: UIView?
var sendButton: UIButton!
var inputTextField: UITextField!

override var inputAccessoryView: UIView? {
    return viewAcc
}

override var canBecomeFirstResponder: Bool {
    return true
}
在ViewDidLoad方法中,为init view添加以下代码,并添加textField和send按钮

    viewAcc = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
    viewAcc?.backgroundColor = UIColor.white
    inputTextField = UITextField (frame: CGRect(x:8, y:0, width:UIScreen.main.bounds.width, height: 44 ))
    inputTextField.inputAccessoryView = nil
    inputTextField.delegate = self as? UITextFieldDelegate
    inputTextField.placeholder = "Enter message..."
    viewAcc?.backgroundColor = .white
    viewAcc?.addSubview(inputTextField);

    let topBorderView = UIView()
    topBorderView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
    viewAcc?.addSubview(topBorderView)
    viewAcc?.addConstraintsWithFormat(format: "H:|[v0]|", views: topBorderView)
    viewAcc?.addConstraintsWithFormat(format: "V:|[v0(0.5)]", views: topBorderView)

    sendButton = UIButton(type: .system)
    sendButton.isEnabled = true
    sendButton.titleLabel?.font = UIFont.systemFont(ofSize: 16)
    sendButton.setTitle("Send", for: .normal)
    sendButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
    sendButton.addTarget(self, action: #selector(handleSend), for: .touchUpInside)
    viewAcc?.addSubview(sendButton)

    inputTextField.translatesAutoresizingMaskIntoConstraints = false
    sendButton.translatesAutoresizingMaskIntoConstraints = false
    viewAcc?.addConstraint(NSLayoutConstraint(item: inputTextField, attribute: .left, relatedBy: .equal, toItem: viewAcc, attribute: .left, multiplier: 1, constant: 8))
    viewAcc?.addConstraint(NSLayoutConstraint(item: inputTextField, attribute: .top, relatedBy: .equal, toItem: viewAcc, attribute: .top, multiplier: 1, constant: 7.5))
    viewAcc?.addConstraint(NSLayoutConstraint(item: inputTextField, attribute: .right, relatedBy: .equal, toItem: sendButton, attribute: .left, multiplier: 1, constant: -2))
    viewAcc?.addConstraint(NSLayoutConstraint(item: inputTextField, attribute: .bottom, relatedBy: .equal, toItem: viewAcc, attribute: .bottom, multiplier: 1, constant: -8))
    viewAcc?.addConstraint(NSLayoutConstraint(item: sendButton, attribute: .right, relatedBy: .equal, toItem: viewAcc, attribute: .right, multiplier: 1, constant: 0))
    viewAcc?.addConstraint(NSLayoutConstraint(item: sendButton, attribute: .bottom, relatedBy: .equal, toItem: viewAcc, attribute: .bottom, multiplier: 1, constant: -4.5))
现在运行该应用程序,您可以看到底部的文本字段和按钮,还可以看到完整的收藏视图。你们只需按住键盘并向下滑动,就可以关闭键盘


希望对您有所帮助

ios swift 4.2上的改进代码显示文本按钮。当输入上述代码时,sendButton自动隐藏,所以我修改它以保持一致

collectionView.keyboardDismissMode = .interactive
    viewAcc = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
    viewAcc?.backgroundColor = UIColor.white
    inputTextField = UITextField (frame: CGRect(x:8, y:0, width:400, height: 44 ))
    inputTextField.inputAccessoryView = nil
    inputTextField.delegate = self as? UITextFieldDelegate
    inputTextField.placeholder = "Enter message..."
    viewAcc?.backgroundColor = .white
    viewAcc?.addSubview(inputTextField);

    let topBorderView = UIView()
    topBorderView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
    viewAcc?.addSubview(topBorderView)
    viewAcc?.addConstraintsInViews(format: "H:|[v0]|", views: topBorderView)
    viewAcc?.addConstraintsInViews(format: "V:|[v0(0.5)]", views: topBorderView)

    sendButton = UIButton(type: .system)
    sendButton.isEnabled = true
    sendButton.titleLabel?.font = UIFont.systemFont(ofSize: 16)
    sendButton.setTitle("Send", for: .normal)
    sendButton.contentEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
    sendButton.addTarget(self, action: #selector(addmessage), for: .touchUpInside)
    viewAcc?.addSubview(sendButton)

    inputTextField.translatesAutoresizingMaskIntoConstraints = false
    sendButton.translatesAutoresizingMaskIntoConstraints = false
    viewAcc?.addConstraintsInViews(format: "H:|-4-[v0][v1(60)]|", views: inputTextField,sendButton)
    viewAcc?.addConstraintsInViews(format: "V:|-4-[v0]-4-|", views: inputTextField)
    viewAcc?.addConstraintsInViews(format: "V:|-4-[v0]-4-|", views: sendButton)

你能发布故事板上的截图吗?只需单击collectionView,我们就可以预览约束。我的第一个猜测是您为collectionView的底部设置了错误的约束。约束是用代码编写的,我遵循了Youtube教程,它使用的是较旧版本的Swift,因此当前版本中的所有内容都不完全相同。您的“输入消息”视图是否仅位于“集合”视图的顶部?底部约束的值是多少?它定位在何处?您应该将约束代码发布到post。很抱歉,我没有时间搜索视频来解决这个问题。@ZassX我只是添加了约束代码,并不意味着你可以通过教程观看,我只是想提一下。如何让Send按钮出现?@random1234它不是uiview contorller附件视图的一部分,因此它将始终位于顶部,这样您就不会面临收藏视图的任何滚动问题什么?我想知道我是如何让Send按钮像以前一样出现在文本字段旁边的。@random1234谢谢你也尝试一下这个很棒的东西
yourCollectionviewObject.keyboardDismissMode=.interactive