【问题标题】:safeAreaLayoutGuide to my inputAccesoryView我的 inputAccesoryView 的 safeAreaLayoutGuide
【发布时间】:2017-10-23 21:46:50
【问题描述】:

所以对于新的 iPhone X,我的应用程序中的某些内容处于错误的位置。在我的应用程序底部,我有一个 accesoryView,它基本上是一个带有文本字段和其他元素的 UIView。我在新的 iPhone X 中看到了一些关于 safeAreaLayoutGuide 的东西,但我现在不知道如何在附件视图中实现。所以我试图在我的应用程序中找到一个代码来实现它,所以 safeArea 不再打扰我了。

这是 inputAccesoryView 的代码

lazy var inputContainerView: UIView = {

    let containerView = UIView()
    containerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 50)
    containerView.translatesAutoresizingMaskIntoConstraints = false
    containerView.backgroundColor = UIColor.white


    containerView.addSubview(self.inputTextField)
    containerView.addSubview(self.swiche)
    containerView.addSubview(self.separatorLineView)
    containerView.addSubview(self.uploadImageView)


    //x,y,w,h
    self.inputTextField.leftAnchor.constraint(equalTo: self.swiche.rightAnchor, constant: 4).isActive = true
    self.inputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    self.inputTextField.rightAnchor.constraint(equalTo: self.uploadImageView.leftAnchor, constant: 4).isActive = true
    self.inputTextField.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true
    self.inputTextField.backgroundColor = UIColor.clear


    //x,y,w,h
    self.swiche.leftAnchor.constraint(equalTo: containerView.leftAnchor, constant: 4).isActive = true
    self.swiche.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    self.swiche.heightAnchor.constraint(equalToConstant: 30).isActive = true
    self.swiche.widthAnchor.constraint(equalToConstant: 55).isActive = true



    //x,y,w,h
    self.uploadImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    self.uploadImageView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
    self.uploadImageView.widthAnchor.constraint(equalToConstant: 47).isActive = true
    self.uploadImageView.heightAnchor.constraint(equalToConstant: 47).isActive = true


    //x,y,w,h
    self.separatorLineView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
    self.separatorLineView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
    self.separatorLineView.widthAnchor.constraint(equalTo: containerView.widthAnchor).isActive = true
    self.separatorLineView.heightAnchor.constraint(equalToConstant: 1).isActive = true


    return containerView

}()




//MARK: AccesoryView
override var inputAccessoryView: UIView? {
    get {

        return inputContainerView

    }
}

谢谢你的帮助!!!

【问题讨论】:

  • 你应该分享一些代码来掌握上下文。
  • 我编辑了帖子@MauricioChirino

标签: ios swift safearealayoutguide


【解决方案1】:

正如我所想,您需要做的就是在指出约束之前访问safeAreaLayoutGuide 类。在您的情况下,您需要更改如下约束:

self.inputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true

进入这样的约束:

self.inputTextField.centerYAnchor.constraint(equalTo: containerView.safeAreaLayoutGuide.centerYAnchor).isActive = true

告诉我进展如何。

【讨论】:

  • 另外,您可以查看这个非常好的答案stackoverflow.com/questions/46344381/…
  • 我试过了,但我得到的是文本字段比以前少了一点。文本字段处于良好位置,但其余元素(通常包括 inputAccesory)仍处于相同位置
  • 我实际上尝试了所有元素,并且处于一个良好的位置,但是它们所处的视图,即inpuaccesory,仍然处于相同的位置
  • 嗯,分享一下repo,我去看看
【解决方案2】:

好的,把这段代码贴到lazy var前面

override func didMoveToWindow() {
    super.didMoveToWindow()
    if #available(iOS 11.0, *) {
    if let window = self.window {
        self.bottomAnchor.constraintLessThanOrEqualToSystemSpacingBelow(window.safeAreaLayoutGuide.bottomAnchor, multiplier: 1.0).isActive = true
     }
   }
}

现在您的视图已打开 safeAreaLayoutGuide...但在底部您可以看到 tableview,因为没有背景(您的视图已打开 safeAreaLayoutGuide),为了纠正问题,我构建了一个白色 uiview,将其呈现在 inputTextField 中并设置约束:

let dummyView = UIView()
    dummyView.backgroundColor = .white
    dummyView.translatesAutoresizingMaskIntoConstraints = false

现在设置约束:

inputTextField.addSubview(dummyView)
    dummyView.topAnchor.constraint(equalTo: inputTextField.bottomAnchor).isActive = true
    dummyView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    dummyView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
    dummyView.heightAnchor.constraint(equalToConstant: 50).isActive = true

这是 hack,但我认为这是 Xcode 错误...希望对您有所帮助...

【讨论】:

    【解决方案3】:

    我希望对于您的代码,您只需为 inputTextField 和其他元素添加此底部约束,并将 containerView CGRect 框架高度设置为 100:

    self.inputTextField.bottomAnchor.constraint(equalTo: containerView.safeAreaLayoutGuide.bottomAnchor).isActive = true
    

    我想你可以删除:

    self.inputTextField.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      相关资源
      最近更新 更多