Home > Back-end >  Sizing a SKScene to fit within iOS screen boundaries
Sizing a SKScene to fit within iOS screen boundaries

Time:10-11

I have written a small macOS application that sizes a 64 x 64 grid of SKSpriteNodes based on the smaller of the height or width of the view:

let pixelSize = min(self.size.width / Double(numColumns), self.size.height / Double(numRows))

...numRows and Columns are both 64. When the window opens at 1024 x 768, it calculates based on 768 and produces a square drawing area centered in the window, and it follows resizes and such.

I then used the Xcode template to add an iOS target. I was surprised to find that the size of the view remains 1024 x 768, in spite of being in a view in Main.storyboard that is 380 x 844. In the storyboard, Game Controller View Scene is set to Aspect Fit and Resize Subviews is turned on. I tried Clips to Bounds and several other settings, but it seems the Scene simply isn't being resized.

Did I miss a setting somewhere? Or should I calculate my sizes some other way?

CodePudding user response:

from within SKScene you can access size via self.view?.frame.size

note however that if you draw your scene once via didMove(to view: SKView) you will potentially miss important resize events that can and will effect the dimensions of your scene. for instance, on macOS the storyboard dimensions will often be overridden with cached values after the application launches. for this reason, i suggest adding responders for resize on macOS and rotation on iOS.

//macOS -- respond to window resize
class GameViewController: NSViewController {  

    //called on window resize
    //(note: NSWindow.didResizeNotification also accesses this event and may be better in some cases)
    override func viewDidLayout() {
        print("view been resized to \(self.view.frame.size)")
    }
}

//iOS -- respond to device rotation
class GameViewController: UIViewController {
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: { context in
            // This is called during the animation
        }, completion: { context in
            // This is called after the rotation is finished. Equal to deprecated `didRotate`
            print("view been resized to \(self.view.frame.size)")
        })
    }
}

ps your code says pixels, but my guess is you probably mean points. a point is aways 1/72th of an inch, i.e. 72dpi. by contrast, pixels will vary depending on the device's resolution (x2 for iPhone 8, x3 for iPhone 12, etc.). i basically only ever care about points when designing an app, not pixels. although this isn't a hard and fast rule and ymmv etc etc.

  • Related