【问题标题】:How to display UIActivityIndicatorView while a SceneKit Scene loads如何在 SceneKit 场景加载时显示 UIActivityIndi​​catorView
【发布时间】:2014-11-15 03:09:40
【问题描述】:

场景加载大约需要 7-9 秒。所以我需要一个活动指示器。

我这样创建微调器:

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];
    spinner.layer.cornerRadius = 5;
    spinner.opaque = NO;
    spinner.backgroundColor = [UIColor clearColor];
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
    [spinner setColor:[UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]];

像这样添加子视图:

    [sceneView addSubView:spinner];

尝试在 viewDidLoad 中调用:

[spinner startAnimating];
//load the scene
[spinner stopAnimating];

但它会永远旋转,场景永远不会加载。

这样做的正确方法是什么?

我根据@mnuages 的回复尝试了这个:

- (void)renderer:(id<SCNSceneRenderer>)aRenderer willRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time  {

if ([self spinner] == nil) {
    _spinner = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(0, 0, 250, 250)];
    _spinner.layer.cornerRadius = 5;
    _spinner.opaque = YES;
    _spinner.backgroundColor = [UIColor purpleColor];
    _spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
    [_spinner setColor:[UIColor colorWithRed:0.6 green:0.8 blue:1.0 alpha:1.0]];
    _spinner.center = self.view.center;

    [self.view addSubview:_spinner];
    [self.view bringSubviewToFront:_spinner];
    [[self spinner] startAnimating];
}

NSLog(@"BEGIN SCENE RENDER %@",scene);

}

- (void)renderer:(id<SCNSceneRenderer>)aRenderer didRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time  {

[[self spinner] stopAnimating];
[_spinner removeFromSuperview];
_spinner = nil;

NSLog(@"END SCENE RENDER %@", scene);

}

但这会被反复调用。并且微调器没有显示。而且我仍然看到一个空白的屏幕(IB中设置的SCNView的初始白色背景颜色,稍后在viewDidLoad中更改为灰色)。

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    你可以看看SCNSceneRenderer.delegate-renderer:didRenderScene:atTime:

    【讨论】:

    • 根据@mnuages 的建议修改了原始代码。仍然没有看到微调器。
    • 第一次渲染视图后,您不应重新显示微调器。配置视图时,添加微调器并启动它。然后当通知您场景已渲染时,移除微调器。
    • viewDidLoad 中启动微调器仍然是一个好主意——您只想使用渲染器委托方法来捕获第一条didRenderScene 消息。
    • 搞定了。配置它并在 -viewDidLoad 中启动动画并在 render:didRenderScene:atTime 中将其关闭。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多