我正在制作自定义键盘。我想根据视图的宽度和高度生成键'(UIButtons)的宽度和高度。
最初加载键盘时,viewDidAppear会正确确定视图的高度。 (375 x 216)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.renderKeys()
}
当旋转到Landscape时,它会调用viewWillTransition
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
NSLog("toSize \(size.width) x \(size.height)")
coordinator.animate(alongsideTransition: {(_ context: UIViewControllerTransitionCoordinatorContext) -> Void in
NSLog("animating \(self.view.frame.width) x \(self.view.frame.height)")
}, completion: {(_ context: UIViewControllerTransitionCoordinatorContext) -> Void in
NSLog("animationCompleted \(self.view.frame.width) x \(self.view.frame.height)")
self.renderKeys()
})
}
旋转回“肖像”会产生此效果。
我发现viewWillTransition的大小并没有正确地确定视图的大小,或者我只是误解了函数的用法。即使在动画之后,我也无法获得正确的视图宽度和高度。
这是调试日志的顺序。
[28651:1348399] Calling viewDidAppear
[28651:1348399] Cleaning keys
[28651:1348399] toSize 667.0 x 216.0
[28651:1348399] animating 667.0 x 216.0
[28651:1348399] animationCompleted 667.0 x 216.0
[28651:1348399] Cleaning keys
[28651:1348399] toSize 375.0 x 162.0
[28651:1348399] animating 375.0 x 162.0
[28651:1348399] animationCompleted 375.0 x 162.0
答案 0 :(得分:2)
我也在自定义键盘中工作,发现了类似的问题。
经过几个小时的实验,我学会了以下内容:
application(didFinishLaunchingWithOptions:)
,applicationDidBecomeActive
)等已执行)viewWillTransition(to size:)
中捕获所有方向过渡。例如在iPhone 8+中,这将报告(414.0,736.0)或(736.0,414.0)的大小现在,将项目作为键盘目标运行: -
application(didFinishLaunchingWithOptions:
),
未报告applicationDidBecomeActive
等
ViewController
都会被加载。viewDidLoad
中的viewSize可能很棘手,因为您可能需要延迟(使用
Timer.scheduledTimer(withTimeInterval:)
,至少在第一次迭代中updateViewConstraints()
中报告,但大小似乎不完全可靠。每次过渡到之后
纵向,它可以报告大小为414 x 736(ScreenSize)或414
x 226(键盘尺寸正确)。在iPhone 8 +的情况下viewWillTransition
方法
横向或从横向到纵向(我猜这与每次旋转中断的视图生命周期有关)。 所以,我正在做的是在延迟后捕捉viewDidLoad
中的屏幕尺寸并忘记updateViewConstraints
或viewWillTransition(to size:)
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (nil) in
print("Load Size: \(self.view.frame.size)")
}
注意*此延迟似乎仅在第一次加载时需要(在这种情况下,偶数updateViewConstraints
在viewDidLoad
之前执行。在以后的viewDidLoad迭代中,它不是必需的。另外。你。可能想要试验延迟,并在实际设备和模拟器中进行测试
参考表:
设备 - (屏幕) - (KeyboardPortrait) - (KeyboardLandscape)
iPhone X - (375 x 812) - (375 x 141) - (662 x 131)
iPhone 8+ - (414 x 736) - (414 x 226) - (736 x 162)
iPhone 7 + / 8 + - (414 x 736) - (414 x 226) - (736 x 162)
iPhone 7/8 - (375 x 667) - (375 x 216) - (667 x 162)
6 / 6s / 6 + / 6s + - 与iPhone 7/8相同
iPhone SE - (320 x 568) - (320 x 216) - (568 x 162)
我希望它有所帮助。问候...... e