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
回复 Adobels (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
如果不是内部运作,它们在结果上看起来都是相同的。
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
回复 Adobels (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
如果不是内部运作,它们在结果上看起来都是相同的。