旋转时更改自定义键盘的高度

Posted

技术标签:

【中文标题】旋转时更改自定义键盘的高度【英文标题】:changing height of a custom keyboard when rotating 【发布时间】:2020-10-13 20:22:40 【问题描述】:

我有一个由代码创建的自定义键盘,它是特定文本字段的唯一输入视图。我在我的项目中实现了这一点:

let keyboardContainerView = KBContainerView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*0.5))
keyboardContainerView.addSubview(myKeyboardView)
textfield.inputView = keyboardContainerView

KBContainerView 是一个 UIView 但有一个功能,就是当检测到设备旋转时,帧发生变化。这很简单。

override init(frame: CGRect) 
    super.init(frame: frame)
    NotificationCenter.default.addObserver(self, selector: #selector(updateFrame), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil)


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)

    
@objc func updateFrame() 
    self.frame = CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*0.5)

但是我发现虽然键盘容器视图发生了变化,当我在命令行上打印它时,键盘的大小似乎并没有改变。这是一个 gif。

从横向视图开始也不会改变高度。

为了解决这个问题,我尝试在输入视图上使用autoresizingMasks,但情况变得更糟,启动应用程序时键盘高度错误。导航栏还覆盖了横向视图中的键盘。

在我的项目中,为了简单起见,我没有写了UIKeyboardviewController。我想要实现的是,当旋转我的设备时,键盘可以占据屏幕的一半空间。 (高度为 0.5 * 屏幕高度)

是不是因为我把改变大小的动作写错了地方?

【问题讨论】:

不相关,但您引用了UIKeyboardViewController。我猜你的意思是UIInputViewController... 【参考方案1】:

通常我会为我的自定义 inputView 使用标准键盘尺寸

autoresizingMask = [.flexibleWidth, .flexibleHeight]

在这种情况下,如果您希望它始终是高度的 50%,您可能需要

关闭translatesAutoresizingMaskIntoConstraints; 为宽度、高度、centerX 和底部添加您自己的约束

例如,下面是一个简单的输入视图,我在键盘输入UIView 子类中定义为窗口高度的 50%:

override func didMoveToSuperview() 
    super.didMoveToSuperview()
    
    translatesAutoresizingMaskIntoConstraints = false

    guard let superview = superview else  return 
    
    var lastView: UIView! = self
    while lastView.superview != nil 
        lastView = lastView.superview
    

    NSLayoutConstraint.activate([
        heightAnchor.constraint(equalTo: lastView.heightAnchor, multiplier: 0.5, constant: 0),
        widthAnchor.constraint(equalTo: superview.widthAnchor),
        centerXAnchor.constraint(equalTo: superview.centerXAnchor),
        bottomAnchor.constraint(equalTo: superview.bottomAnchor)
    ])

现在我正在爬取视图层次结构以获取***视图。也许您想将您希望它用于高度约束的视图传递给它。我只是讨厌提及UIScreen.main,因为有时我们的应用不会全屏显示。

但我们不要迷失在细节中。关键是使用约束,让自动布局引擎为我们做所有事情。这样我们就不必自己响应轮换事件了:

【讨论】:

嘿,Rob,感谢您提供这个精美的答案。如果我们希望键盘高度是纵向的,而横向的呢?我刚刚问了一个类似的问题,你介意检查一下吗?提前谢谢你

以上是关于旋转时更改自定义键盘的高度的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 自定义键盘方向更改

iOS 8自定义键盘:更改高度

通过情节提要自定义键盘高度

iOS 8 自定义键盘:更改高度而不发出警告“无法同时满足约束...”

iOS 8自定义键盘的高度限制根本不起作用

iOS自定义键盘高度启动故障