setGameScreenStateChangeListener
设置游戏屏幕状态变更监听器
setGameScreenStateChangeListener 用于监听小游戏内部触发的屏幕显示状态变化。当小游戏由于业务逻辑(如进入全屏播放、切换横竖屏、或者调整渲染区域大小时),SDK 会通过该监听器通知宿主 App,以便原生层同步调整容器视图(GameView)的布局或状态栏显示。
方法声明
objectivec
/**
* 设置屏幕状态变更监听。
* @param listener 遵循 SUDRTGameScreenStateChangeListener 协议的对象。
*/
- (void)setGameScreenStateChangeListener:(nullable id<SUDRTGameScreenStateChangeListener>)listener;参数说明
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| listener | id<SUDRTGameScreenStateChangeListener> | 否 | 监听器实例。传入 nil 则取消监听。 |
运行行为
- 主动通知:当小游戏脚本调用改变屏幕方向(Orientation)或全屏切换接口时,引擎会触发此回调。
- 参数透传:回调中通常包含新的屏幕尺寸、旋转角度或是否全屏的状态标识。
- UI 同步:宿主 App 接收到通知后,需配合旋转手机物理方向或调整
gameView的frame属性,以确保渲染内容不拉伸、不黑边。
代码示例
通过该监听器,可以实现小游戏从竖屏列表无缝切换到横屏全屏游戏:
objectivec
// 1. 实现协议
@interface GameViewController () <SUDRTGameScreenStateChangeListener>
@end
@implementation GameViewController
- (void)setupScreenListener {
// 2. 注册监听
[self.gameHandle setGameScreenStateChangeListener:self];
}
#pragma mark - SUDRTGameScreenStateChangeListener
- (void)onGameScreenStateChanged:(NSDictionary *)screenInfo {
// 3. 解析屏幕信息(例如:isLandscape, width, height)
BOOL isLandscape = [[screenInfo objectForKey:@"isLandscape"] boolValue];
// 4. 必须在主线程更新 UI 布局
dispatch_async(dispatch_get_main_queue(), ^{
if (isLandscape) {
// 执行旋转动画或调整约束
[self switchToLandscapeMode];
} else {
[self switchToPortraitMode];
}
// 5. 重新调整 gameView 的尺寸以匹配新布局
UIView *gameView = [self.gameHandle getGameView];
gameView.frame = self.view.bounds;
});
}
@end注意事项
- 自动旋转:如果 App 开启了系统的自动旋转功能,需注意
gameView的布局自适应逻辑不要与此监听器的手动调整逻辑发生冲突。 - 状态栏处理:进入全屏模式时,通常需要通过此回调同步隐藏 iOS 系统的状态栏(StatusBar)。
- 安全区域:在处理 iPhone 顶部刘海屏(Safe Area)时,建议根据
screenInfo中的参数动态计算内边距,防止游戏 UI 被遮挡。 - 时机敏感:屏幕切换往往伴随着渲染重绘,建议在调整完原生视图
frame后,调用引擎的相关刷新接口(如果需要)。