【发布时间】:2018-09-03 23:24:20
【问题描述】:
我正在尝试在我的登录 UI 中使用 SKView 来制作一些动画。 SKView 作为子视图添加到 LoginContainerView 以及包含 UITextFields 和登录按钮的视图。所有子视图都使用自动布局定位,并且附加到 SKView 的 FireScene 的 scaleMode 设置为 .resizeFill。
从这段视频中可以清楚地看到我遇到的问题:https://streamable.com/5it17。
剪辑说明:每当我双击任何 UITextFields(触发 UIMenuController / Paste 按钮)
FireScene冻结短暂 时间量(但它非常明显)并且 FPS 在 1-2 秒内下降到 30 左右。
FireScene 添加为其子节点的唯一节点是修改后的萤火虫 SKEmitterNode 模板。我相当确定这与实际代码无关(因为它非常简单明了),并且可能是 UIKit 与 SpriteKit 错误混合。
相关代码:
class FireScene: SKScene {
// MARK: - Properties
var fireSparkEmitter: SKEmitterNode? = nil
// MARK: - Inherited
override func didChangeSize(_ oldSize: CGSize) {
// position the emitter to scene's center
fireSparkEmitter?.position = CGPoint(x: size.width/2, y: size.height/2)
}
override func didMove(to view: SKView) {
if let emitter = fireSparkEmitter {
emitter.resetSimulation()
} else {
guard let emitter = SKEmitterNode(fileNamed: "FireSparks.sks") else { return }
addChild(emitter)
fireSparkEmitter = emitter
}
}
}
class LoginContainerView: UIView {
/// ...
let fireBackgroundScene: FireScene = {
let scene = FireScene(size: .zero)
scene.scaleMode = .resizeFill
return scene
}()
/// ...
// MARK: - Inherited
// called after view initialization
func setupSubviews() {
let skView = SKView(frame: .zero)
skView.translatesAutoresizingMaskIntoConstraints = false
addSubview(skView)
skView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
skView.topAnchor.constraint(equalTo: topAnchor).isActive = true
skView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
skView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
skView.showsFPS = true
skView.presentScene(fireBackgroundScene)
}
}
PS:我尝试使用 Time Profiler 分析应用程序,似乎瓶颈是 UIKit 本身的 UITextField 手势处理。
【问题讨论】:
-
什么叫 setupSubviews?
标签: ios swift sprite-kit uitextfield skscene