我正在开发自定义键盘扩展程序并注意到当我在self.inputView.frame.size.width
或viewDidLoad
中调用viewWillAppear
时,它会返回0或错误的数字。仅在viewDidAppear
中才是正确的。这是一个问题,因为我需要根据可用的宽度和高度更新键盘中元素的大小。现在我通过检测viewWillLayoutSubviews
中的帧大小来处理这个问题,在正确之前调用它几次。这样可以工作,但是用户可以看到键盘中的元素大小发生变化 - 直到框架呈现给用户之后,框架才会正确。这也是一个问题,因为一旦元素的大小正确,我需要更新滚动位置,因此我不得不将其延迟到viewDidAppear
。这并不是一个很好的用户体验,在它出现之后就会跳跃。
有什么方法可以在生命周期的早期知道键盘的高度和宽度,这样我就可以在元素对用户可见之前设置它们的大小了吗?
我正在使用XIB创建使用自动布局的键盘界面。这就是我将它添加到键盘的方式:
let keyboardNib = UINib(nibName: "KeyboardView", bundle: nil)
let keyboardInterface = keyboardNib.instantiateWithOwner(self, options: nil)[0] as! UIView
keyboardInterface.setTranslatesAutoresizingMaskIntoConstraints(false)
self.inputView.addSubview(keyboardInterface)
let verticalConstraints: [NSLayoutConstraint] = NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[keyboardInterface]-0-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["keyboardInterface": keyboardInterface, "view": view]) as! [NSLayoutConstraint]
let horizontalConstraints: [NSLayoutConstraint] = NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[keyboardInterface]-0-|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["keyboardInterface": keyboardInterface]) as! [NSLayoutConstraint]
self.inputView.addConstraints(verticalConstraints)
self.inputView.addConstraints(horizontalConstraints)