2014-11-14 4 views
0

Загрузка сцены занимает около 7-9 секунд. Поэтому мне нужен индикатор активности.Как отобразить UIActivityIndicatorView при загрузке сцены SceneKit

Я создаю блесну, как это:

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); 

}

Но это не вызывается повторно. И прядильщик не показывает. И я до сих пор вижу пустой белый экран (исходный белый цвет фона SCNView, установленный в IB, который позже изменяется на серый в viewDidLoad).

ответ

1

вы можете посмотреть на SCNSceneRenderer.delegate и -renderer:didRenderScene:atTime:

+0

пересмотренном исходный код, основанный на предложении от @mnuages. Все еще не вижу прядильщика. – sambro

+1

, вы не должны повторно отображать счетчик, как только представление было отображено в первый раз. Когда вы настраиваете представление, добавьте счетчик и запустите его. Затем, когда вы будете уведомлены о том, что сцена была отображена, удалите счетчик. – mnuages

+1

Запуск spinner в 'viewDidLoad' по-прежнему является хорошей идеей - вы хотите использовать методы делегата рендеринга только для того, чтобы поймать первое сообщение' didRenderScene'. – rickster

Смежные вопросы