首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当键盘折叠时,inputAccessoryView不尊重safeAreaLayoutGuide

当键盘折叠时,inputAccessoryView不尊重safeAreaLayoutGuide
EN

Stack Overflow用户
提问于 2021-02-05 06:28:11
回答 2查看 440关注 0票数 2

我正在努力使inputAccessoryView正常工作。也就是说,在本例中,我希望能够以两种可能的状态显示UIToolbar:

键盘上方的

  1. ??当键盘被解压时,屏幕底部的标准行为和预期行为
  2. (例如,在模拟器中命令+K)--在这种情况下,bottomAnchor尊重底部的bottomAnchor。

我已经对这个话题进行了广泛的研究,但我能找到的每一个建议都有一些解决方案,这些方法似乎与苹果工程公司提出的解决方案不一致。基于一张开放雷达票,Apple工程公司提出了以下解决方案:

--尊重输入附件视图的safeAreaInsets是您的责任。我们以这种方式设计它,这样开发人员就可以提供一个背景视图(即,查看Safari在页面输入附件视图上的查找),并列出与safeAreaInsets相关的内容视图。这是相当简单的实现。有一个视图层次结构,其中您有一个容器视图和一个内容视图。容器视图可以具有包含其整个边界的背景色或背景视图,并且它基于safeAreaInsets布局其内容视图。如果使用autolayout,只需将内容视图的bottomAnchor设置为等于它的superview的safeAreaLayoutGuide。

上面的链接是:http://www.openradar.me/34411433

因此,我构建了一个简单的xCode项目(iOS应用程序模板),它有以下代码:

代码语言:javascript
复制
class ViewController: UIViewController {
    
    var field = UITextField()
    var containerView = UIView()
    var contentView = UIView()
    var toolbar = UIToolbar()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // TEXTFIELD
        field = UITextField(frame: CGRect(x: 20, y: 100, width: view.frame.size.width, height: 50))
        field.placeholder = "Enter name..."
        field.backgroundColor = .secondarySystemBackground
        field.inputAccessoryView = containerView
        view.addSubview(field)
        
        // CONTAINER VIEW
        containerView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50)
        containerView.backgroundColor = .systemYellow
        containerView.translatesAutoresizingMaskIntoConstraints = false
                
        // CONTENT VIEW
        contentView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50)
        contentView.backgroundColor = .systemPink
        contentView.translatesAutoresizingMaskIntoConstraints = false
        containerView.addSubview(contentView)
        
        // TOOLBAR
        toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 50))
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(didTapDone))
        toolbar.setItems([flexibleSpace, doneButton], animated: true)
        toolbar.backgroundColor = .systemGreen
        toolbar.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(toolbar)
        
        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: containerView.topAnchor),
            contentView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
            contentView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
            contentView.bottomAnchor.constraint(equalTo: contentView.superview!.safeAreaLayoutGuide.bottomAnchor),

            toolbar.topAnchor.constraint(equalTo: contentView.topAnchor),
            toolbar.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            toolbar.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            toolbar.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
        ])
    }
    
    
    @objc private func didTapDone() {
        print("done tapped")
    }
}

结果在键盘可见时起作用,但一旦键盘被忽略,则不会:

我使用了各种视图的高度,结果参差不齐,使容器视图帧的高度更大(例如100),在键盘折叠时显示工具栏,当键盘可见时,它也会使工具栏太高。

显然,我提出了一些自动布局限制问题,但我无法工作,并希望任何反馈意见,提供一个与苹果公司的建议一致的工作解决方案。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-02-05 07:06:03

在我的例子中,我使用了以下方法:

代码语言:javascript
复制
import UIKit

extension UIView {
    
    
    
   
    
    func setDimensions(height: CGFloat, width: CGFloat) {
        translatesAutoresizingMaskIntoConstraints = false
        heightAnchor.constraint(equalToConstant: height).isActive = true
        widthAnchor.constraint(equalToConstant: width).isActive = true
    }
    
    func setHeight(_ height: CGFloat) {
        translatesAutoresizingMaskIntoConstraints = false
        heightAnchor.constraint(equalToConstant: height).isActive = true
    }
}



class CustomTextField: UITextField {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    convenience init(placeholder: String) {
        self.init(frame: .zero)
        configureUI(placeholder: placeholder)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func configureUI(placeholder: String) {
        
        let spacer = UIView()
        spacer.setDimensions(height: 50, width: 12)
        leftView = spacer
        leftViewMode = .always
        
        borderStyle = .none
        textColor = .white
        keyboardAppearance = .dark
        backgroundColor = UIColor(white: 1, alpha: 0.1)
        setHeight(50)
        attributedPlaceholder = NSAttributedString(string: placeholder, attributes: [.foregroundColor: UIColor(white: 1, alpha: 0.75)])
        
        
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-06-15 11:12:37

我能够通过包装工具栏(在我的例子中是聊天输入栏)并将它限制在top/right/left + bottom到包装器的安全区域来达到这个效果。

我会在下面留下一个大致的食谱。

在您的视图中,控制器:

代码语言:javascript
复制
override var inputAccessoryView: UIView? {
    keyboardHelper
}
    
override var canBecomeFirstResponder: Bool {
    true
}

lazy var keyboardHelper: InputBarWrapper = {
    let wrapper = InputBarWrapper()
    let inputBar = InputBar()
    helper.addSubview(inputBar)
    inputBar.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
        inputBar.topAnchor.constraint(equalTo: helper.topAnchor),
        inputBar.leftAnchor.constraint(equalTo: helper.leftAnchor),
        inputBar.bottomAnchor.constraint(equalTo:
helper.safeAreaLayoutGuide.bottomAnchor),
        inputBar.rightAnchor.constraint(equalTo: helper.rightAnchor),
    ])
    
    return wrapper
}()

工具栏包装子类:

代码语言:javascript
复制
class InputBarWrapper: UIView {
        
    var desiredHeight: CGFloat = 0 {
        didSet { invalidateIntrinsicContentSize() }
    }
    
    override var intrinsicContentSize: CGSize {
        CGSize(width: 0, height: desiredHeight)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame);
        autoresizingMask = .flexibleHeight
        backgroundColor = UIColor.systemGreen.withAlphaComponent(0.2)
    }

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66058580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档