旋转时更改自定义键盘的高度
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,感谢您提供这个精美的答案。如果我们希望键盘高度是纵向的,而横向的呢?我刚刚问了一个类似的问题,你介意检查一下吗?提前谢谢你以上是关于旋转时更改自定义键盘的高度的主要内容,如果未能解决你的问题,请参考以下文章