【问题标题】:iOS: What event is triggered when the keyboard appearsiOS:键盘出现时触发什么事件
【发布时间】:2023-03-12 17:45:02
【问题描述】:

我正在将 JSQMessagesController 用于我正在处理的项目并在 Github 页面上打开了一个问题,但是在与作者协商后我们无法解决该问题。

我有一个由消息列表填充的 collectionView,但是当第一次加载视图时,顶部消息会从屏幕顶部截断,当键盘显示并关闭时,视图会按预期显示,如图所示下面:

当显示键盘时,显然会触发一个重新验证布局的事件,但它是什么?我尝试了以下步骤:

self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()

但这并没有解决问题 - 任何见解都会受到赞赏。

编辑:经过测试,当我为视图设置背景图像时,视图层次结构似乎无效:

backgroundView = UIImageView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
backgroundView.image = UIImage(named: "background")
self.view.insertSubview(backgroundView, atIndex: 0)

删除这些行可以消除不希望的上边距,但是调出键盘仍将解决损坏的约束。

【问题讨论】:

  • 需要将UICollectionView顶部约束设置为Top Layout Guide,这样View才能正确放置在UINavigationBar下方
  • 您能否提供有关如何执行此操作的答案,以便我接受? :)
  • 你在使用 Storyboard 吗?
  • 不使用 Storyboard 或 Nib,否则我将使用界面生成器设置约束 - 所有视图约束都已通过框架设置,因此我必须在代码中手动设置它

标签: ios objective-c swift uicollectionview


【解决方案1】:

您是否尝试过更改集合视图的插图?比如:

[self.collectionView setContentInset:UIEdgeInsetsMake(64.0, 0.0, 0.0, 0.0)];

【讨论】:

    【解决方案2】:

    你有没有试过下面的解决方案..at

    -(void) viewWillLayoutSubviews //(或者) -(void) viewDidLoad 方法

    self.navigationController.navigationBar.translucent = NO;
    
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
    

    希望对您有所帮助...!

    【讨论】:

    • 嘿,这很好用 - 但是它将我的标签栏移动到屏幕顶部
    【解决方案3】:

    好吧,要更新代码中的约束,您必须执行以下操作:

    [self.collectionView removeConstraints:self.collectionView.constraints];
    NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:self.collectionView
                                 attribute:NSLayoutAttributeTop
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.topLayoutGuide
                                 attribute:NSLayoutAttributeBottom
                                multiplier:1.0
                                  constant:0.0];
    NSLayoutConstraint *leading = [NSLayoutConstraint
                                   constraintWithItem:self.collectionView
                                   attribute:NSLayoutAttributeLeading
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:self
                                   attribute:NSLayoutAttributeLeading
                                   multiplier:1.0f
                                   constant:0.f];
    NSLayoutConstraint *trailing = [NSLayoutConstraint
                                   constraintWithItem:self.collectionView
                                   attribute:NSLayoutAttributeTrailing
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:self
                                   attribute:NSLayoutAttributeTrailing
                                   multiplier:1.0f
                                    constant:0.f];
    NSLayoutConstraint *bottom = [NSLayoutConstraint
                                    constraintWithItem:self.collectionView
                                    attribute:NSLayoutAttributeBottom
                                    relatedBy:NSLayoutRelationEqual
                                    toItem:self.bottomLayoutGuide
                                    attribute:NSLayoutAttributeTop
                                    multiplier:1.0f
                                    constant:0.f];
    
    [self.collectionView addConstraints:@[top,leading,trailing,bottom]];
    

    【讨论】:

      【解决方案4】:

      您可以使用您使用的UITextFielddelegate 方法:

      - (BOOL)textViewShouldBeginEditing:(UITextView *)textView

      【讨论】:

      • 我会使用这个,但是似乎 JSQMessageController 的 UITextView 是一个私有成员,因此我不能手动调用它的委托方法
      猜你喜欢
      • 2018-09-22
      • 2011-03-06
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2016-08-30
      • 1970-01-01
      相关资源
      最近更新 更多