ffi 3.2 C4: migrate uikit.sx UIKit chrome cluster to #objc_class
Fourth cluster — was blocked on issue-0043, now unblocked by the
preceding `Self`-substitution fix.
Classes declared:
- UIScreen → mainScreen (class), nativeScale + bounds (instance)
- UIView → safeAreaInsets, addSubview, layer (all instance)
- UIWindow → alloc (class), initWithWindowScene, setRootViewController,
makeKeyAndVisible, screen (instance)
- UIViewController → alloc (class), init, setView (instance)
- UITextField → alloc (class), init, becomeFirstResponder,
resignFirstResponder (instance)
Migration sites in uikit.sx:
- `show_keyboard` / `hide_keyboard` → `tf.becomeFirstResponder()` /
`tf.resignFirstResponder()` on a `*UITextField` cast of `text_field`.
- `uikit_refresh_safe_insets` → `gl_view.safeAreaInsets()` on a
`*UIView` cast of `plat.gl_view`.
- `uikit_read_screen_scale` and GL-context bring-up →
`UIScreen.mainScreen().nativeScale()`.
- `uikit_keyboard_will_change_frame` → `win.screen().bounds()`.
- `uikit_scene_will_connect_ios` (the function that triggered 0043) →
`UIWindow.alloc().initWithWindowScene(scene)`,
`UIViewController.alloc().init()`, `vc.setView(...)`,
`win.setRootViewController(...)`, `gl_view.layer()`,
`UITextField.alloc().init()`, `gl_view.addSubview(...)`,
`win.makeKeyAndVisible()`.
Three `objc_getClass(...)` lookups (UIWindow, UIViewController,
UITextField) are gone — the class slots come from the declarative
bindings via `__sx_objc_class_init`. UIScreen has the same shape.
167/167 example tests; chess clean on macOS / iOS sim / Android via
`tools/verify-step.sh`.