Загрузка сцены занимает около 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).
пересмотренном исходный код, основанный на предложении от @mnuages. Все еще не вижу прядильщика. – sambro
, вы не должны повторно отображать счетчик, как только представление было отображено в первый раз. Когда вы настраиваете представление, добавьте счетчик и запустите его. Затем, когда вы будете уведомлены о том, что сцена была отображена, удалите счетчик. – mnuages
Запуск spinner в 'viewDidLoad' по-прежнему является хорошей идеей - вы хотите использовать методы делегата рендеринга только для того, чтобы поймать первое сообщение' didRenderScene'. – rickster