Цель - прокрутить SKScene
с тем же поведением, что и UIScrollView
.
Другие вопросы похожи, но ответы не помогли.
Этот код иллюстрирует, как UIScrollView + SKView будет отображать контент, когда подпредставление SKView имеет высоту 2000 точек, но ничего не показывает, если подпредставление имеет высоту 2050 точек.
Высота имеет значение, потому что, если SKScene содержит карту узлов, например, высотой 3000 точек, нам нужна сцена, визуализированная в UIScrollView (путем представления сцены внутри SKView, которая сама является подпредставлением UIScrollView) .
class TestViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
// Call super
super.viewDidLoad()
// Make scene (then someone call the police)
let scene = TestScene(size: UIScreen.main.bounds.size)
// Allow other overlays to get presented
definesPresentationContext = true
// Set background color
scrollView.backgroundColor = UIColor.clear
// Create content view for scrolling since SKViews vanish with height > 2050
let contentHeight = scene.getScrollHeight()
let contentFrame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: contentHeight)
let contentView = UIView(frame: contentFrame)
contentView.backgroundColor = UIColor.clear
// Create SKView
let skFrame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: contentHeight)
let skView = SKView(frame: skFrame)
// Configure <scrollView>
scrollView.insertSubview(skView, at: 0)
scrollView.addSubview(contentView)
scrollView.delegate = self
scrollView.contentSize = contentFrame.size
// Present scene
skView.presentScene(scene)
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scene.scrollBy(offset: scrollView.contentOffset.y)
}
}