I like that you took on a bigger challenge!
Sadly, I started looking at it on a device that wasn't sized right to finish the game. But it all worked. So!
The amount of code will be somewhat less overwhelming if you add a function to initialize the labels, e.g.:
func makeLabel(text: String, font: UIFont, textColor: UIColor) -> UILabel {
var label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = text
label.font = font
label.textColor = textColor
return label
}
…and call it like so:
currentWordLabel = makeLabel(text: currentWord,
font: UIFont.systemFont(ofSize: 24),
textColor: UIColor.systemGray)
…which will reduce a lot of the wall of labels at the beginning.
The general way of solving the layout challenge is to get the size of the screen (UIScreen.main.bounds), decided on left/right and/or top/bottom measurements, then dividing the remaining space between the number of items you want to show. While 3x9 is useful for the taller, skinnier iPhones, 4x7 may work better for squarer devices.
As far as centering (an implied question in a comment in your code), the previous paragraph can work. Out in industry most people using code for layout are using autolayout, which has a pretty descriptive layout syntax. The guys over at talk.objc.io did several free episodes (241 is the one I'm thinking of) showing how autolayout can solve some problems that are (or at least were at the time of the video) harder to implement in SwiftUI.
FYI: https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html
(Autolayout can be expressed either in storyboards or in code.)
You are getting some constraint conflicts in the console window, but that's a polish thing.
Solid effort!