Skip to content

setGameScreenStateChangeListener

设置游戏屏幕状态变更监听器

setGameScreenStateChangeListener 用于监听小游戏内部触发的屏幕显示状态变化。当小游戏由于业务逻辑(如进入全屏播放、切换横竖屏、或者调整渲染区域大小时),SDK 会通过该监听器通知宿主 App,以便原生层同步调整容器视图(GameView)的布局或状态栏显示。


方法声明

objectivec
/**
 * 设置屏幕状态变更监听。
 * @param listener 遵循 SUDRTGameScreenStateChangeListener 协议的对象。
 */
- (void)setGameScreenStateChangeListener:(nullable id<SUDRTGameScreenStateChangeListener>)listener;

参数说明

参数名类型必传描述
listenerid<SUDRTGameScreenStateChangeListener>监听器实例。传入 nil 则取消监听。

运行行为

  1. 主动通知:当小游戏脚本调用改变屏幕方向(Orientation)或全屏切换接口时,引擎会触发此回调。
  2. 参数透传:回调中通常包含新的屏幕尺寸、旋转角度或是否全屏的状态标识。
  3. UI 同步:宿主 App 接收到通知后,需配合旋转手机物理方向或调整 gameViewframe 属性,以确保渲染内容不拉伸、不黑边。

代码示例

通过该监听器,可以实现小游戏从竖屏列表无缝切换到横屏全屏游戏:

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 后,调用引擎的相关刷新接口(如果需要)。