swift 游乐场 UITextField 生成的键盘太大

swift playground UITextField spawns keyboard that is too big

Swift 在 Mac OS 的操场上。当用户在 UI 文本字段中单击时,会生成一个键盘,但它与视图相比非常大,并且只有前几个键可用。

最小示例:

import UIKit
import PlaygroundSupport

class TesterViewController : UIViewController {
var testTextField : UITextField!
override func loadView() {
    let view = UIView()
    view.backgroundColor = .white

    testTextField = UITextField()
    testTextField.borderStyle = .roundedRect
    testTextField.text = ""
    view.addSubview(testTextField)
    testTextField.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        testTextField.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
        testTextField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
        ])

    self.view = view
    }
}
PlaygroundPage.current.liveView = TesterViewController()

截图

我遇到了同样的问题。 Playground 似乎有一个硬编码的屏幕尺寸为 768x1024(运行 UIScreen.main.bounds 在 Playground 中)并且根据这个尺寸显示键盘,独立于实时视图的实际尺寸。

我想到的最佳解决方法是增加视图控制器的大小,使其与键盘匹配:

let vc = TesterViewController()
vc.preferredContentSize = vc.view.frame.size // or a custom CGSize
PlaygroundPage.current.liveView = vc

当然,这会使视图比您希望的更大,所以我只在确实需要访问屏幕键盘进行测试时才使用此解决方法。

系统键盘根据按键 window 大小呈现,在游乐场模拟器的情况下,大小为 768x1024。看来是个bug。

有效的解决方案:

与其传递视图控制器,不如传递具有自定义大小的 window。

let window = UIWindow(frame: CGRect(x: 0,
                                    y: 0,
                                    width: 768,
                                    height: 1024))
let viewController = MyViewController()
window.rootViewController = viewController
window.makeKeyAndVisible()

PlaygroundPage.current.liveView = window

适用于 Xcode 11 及更高版本(最新测试版本 Xcode 12.2)

已编辑

我已经检查了建议使用“vc.preferredContentSize”的答案,但它对我不起作用。在 Xcode 12.2

中测试
let vc = TextFieldViewController()
vc.preferredContentSize = CGSize(width: 768,height: 1024)
PlaygroundPage.current.liveView = vc

回复 Adob​​els (Seo 21 '19) ...

我不确定他为什么提出不同的方法。

我修改了 dr_barlo 17 年 10 月 22 日的方法如下(它也适用于 Xcode 11):

let vc = TextFieldViewController()
vc.preferredContentSize = CGSize.init(width: 768,height: 1024)
PlaygroundPage.current.liveView = vc

如果不是内部运作,它们在结果上看起来都是相同的。