我正在制作自定义键盘。我想根据 View 的宽度和高度生成键(UIButtons)的宽度和高度。
最初加载键盘时,viewDidAppear 会正确确定 View 的高度。 (375 x 216)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.renderKeys()
}
当旋转到横向时,它会调用 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 的大小不能正确确定 View 的大小,或者我只是误解了该函数的用法。即使在动画之后,我也无法获得正确的 View 宽度和高度。
这是按顺序排列的调试日志。
[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
我也在使用自定义键盘,发现了类似的问题。
经过几个小时的实验,我学到了以下几点:
application(didFinishLaunchingWithOptions
, applicationDidBecomeActive
)等被执行)viewWillTransition(to size
中捕获。例如在 iPhone 8+ 中,这将报告大小为 (414.0, 736.0) 或 (736.0, 414.0)现在,将项目作为键盘目标运行: -
应用程序(didFinishLaunchingWithOptions:
),
applicationDidBecomeActive
等不上报
ViewController
。Timer.scheduledTimer(withTimeInterval
,至少在第一次迭代中updateViewConstraints()
中报告了viewSize,但大小似乎并不完全可靠。每次过渡到
纵向,它可以报告尺寸为 414 x 736 (ScreenSize) 或 414
x 226(正确的键盘尺寸)。如果是 iPhone 8+viewWillTransition
方法
到横向或从横向到纵向(我想这与每次旋转中断的 View 生命周期有关)。 所以,我正在做的是在延迟后捕获 viewDidLoad
中的屏幕大小并忘记 updateViewConstraints
或 viewWillTransition(to size
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (nil) in
print("Load Size: \(self.view.frame.size)")
}
注意* 这个延迟似乎只在第一次加载时需要(在这种情况下,甚至 updateViewConstraints
在 viewDidLoad
之前执行。在 viewDidLoad 的以下迭代中,它是不需要。另外。您可能想试验一下延迟,并在实际设备和模拟器中进行测试
引用表:
设备 -(屏幕)-(键盘纵向)-(键盘横向)
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
关于ios - viewWillTransition 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309308/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |