Добавление UIActivityIndicator в модальное представление (ELCimagepicker)

Я добавил в свой проект ELCimagepicker (https://github.com/Fingertips/ELCImagePickerController), и он отлично работает, позволяя пользователю выбирать несколько изображений для слайд-шоу. Но когда вы нажимаете «Сохранить», может возникнуть длительная задержка в зависимости от того, сколько фотографий было добавлено.

Я пытался добавить UIActivityIndicator, когда пользователь нажимает «Сохранить», но у меня возникли проблемы из-за представленного модального представления. Я могу вызвать метод из действия, которое представляет ELCimagepicker (ELCImagePickerController), и на него воздействует действие, обрабатывающее представление средства выбора изображений. Но всякий раз, когда я пытаюсь добавить в представление, оно не отображается, так как модальное окно находится поверх индикатора активности.

Я пытался использовать BringSubviewToFront, я пытался добавить код непосредственно в файл метода выбора изображений с помощью [[self parentViewController] addSubView], но безуспешно.

Вот последний код, который я пробовал: (индикатор объявлен в файле .h как UIActivityIndicator *indicator)

 indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
indicator.hidden=false;

[self.navigationController.view addSubview:self.indicator];
[self.navigationController.view bringSubviewToFront:self.indicator];

[indicator startAnimating];

if([delegate respondsToSelector:@selector(elcImagePickerController:showIndicator:)]) {
    [delegate performSelector:@selector(elcImagePickerController:showIndicator:) withObject:self withObject:@"test"];
}

Кто-нибудь добился успеха с добавлением UIActivityIndicator поверх ELCimagepicker или другого модального представления, обрабатываемого другим классом?

Я пробовал MBProgressHUD, но тоже не мог заставить его работать правильно - он появлялся, когда я использовал его в классе ELCimagepicker, но вылетал при удалении с:

bool _WebTryThreadLock(bool), 0x42368e0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...

Любая помощь была бы фантастической.

Спасибо.


person wickets    schedule 28.05.2011    source источник
comment
Вы можете опубликовать рабочий код?   -  person Matthew Lanham    schedule 03.07.2011
comment
@toddl, не могли бы вы опубликовать свой рабочий код или руководство, так как я столкнулся с аналогичной проблемой для установки индикатора. и я также не очень хорошо знаком с PerformSelectorOnMainThread и с тем, как заставить его работать.   -  person Janak Nirmal    schedule 21.11.2011
comment
@toddl Привет, не могли бы вы опубликовать полезный код. как вы решили, как я до сих пор не могу решить. какие-нибудь рекомендации, пожалуйста?   -  person Janak Nirmal    schedule 22.11.2011


Ответы (3)


Я разобрался с твоей проблемой. Вы можете сделать это, как показано ниже.

-(void)selectedAssets:(NSArray*)_assets {

UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
UIViewController * topView = [self.viewControllers objectAtIndex:[self.viewControllers count]-1];
activityIndicator.center = CGPointMake(topView.view.frame.size.width/2, topView.view.frame.size.height/2);
[activityIndicator setHidden:NO];
[topView.view addSubview:activityIndicator];
[topView.view bringSubviewToFront:activityIndicator];
[activityIndicator startAnimating];

[self performSelector:@selector(doProcess:) withObject:_assets afterDelay:2.1];

}

- (void) doProcess:(NSArray *)_assets {

NSMutableArray *returnArray = [[[NSMutableArray alloc] init] autorelease];

for(ALAsset *asset in _assets) {

    NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init];
    [workingDictionary setObject:[asset valueForProperty:ALAssetPropertyType] forKey:@"UIImagePickerControllerMediaType"];
    [workingDictionary setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]] forKey:@"UIImagePickerControllerOriginalImage"];
    [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:@"UIImagePickerControllerReferenceURL"];

    [returnArray addObject:workingDictionary];

    [workingDictionary release];    
}

[self popToRootViewControllerAnimated:NO];
[[self parentViewController] dismissModalViewControllerAnimated:YES];

if([delegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) {
    [delegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:[NSArray arrayWithArray:returnArray]];
}

}

Дайте мне знать, если этот ответ поможет вам ...

Спасибо, МинуМастер

person MinuMaster    schedule 24.11.2011

Похоже, вы обновляете пользовательский интерфейс в фоновом потоке. Все обновления UIKit должны выполняться в основном потоке. Поэтому я рекомендую вам выполнять методы, выполняющие обновления пользовательского интерфейса, используя performSelectorOnMainThread:withObject:.

person Deepak Danduprolu    schedule 28.05.2011
comment
Спасибо. Теперь я реализовал обратный вызов в основной класс как [делегат executeSelectorOnMainThread:@selector(elcImagePickerController:) withObject:self waitUntilDone:YES]; Это вызывается в моем основном классе и отображает индикатор активности, но только ПОСЛЕ завершения модального просмотра. Я думаю, что, возможно, неправильно добавляю его в представление - я пробовал [self.view addSubview: activityIndicator], который показывался только потом, поэтому я пробовал такие вещи, как self.navigationController.view и visibleViewController, topViewController и т. д. Как это сделать? Я говорю, что это должно быть «поверх» модального представления? - person wickets; 28.05.2011
comment
Вы можете сохранить ссылку на контроллер модального представления и добавить activityIndicator в его подпредставление, когда вызывается метод делегата, или иначе вы можете использовать уведомления. - person Deepak Danduprolu; 28.05.2011
comment
Контроллер модального представления называется elcPicker, и я делаю это, когда он вызывается обратно в основном классе из класса imagepicker с помощью PerformSelectorOnMainThread, с [elcPicker.view addSubview:activityIndicator], но это когда он не появляется. - person wickets; 28.05.2011
comment
Спасибо - теперь у меня все работает с комбинацией PerformSelectorOnMainThread и изменением классов elcImagePicker на PerformSelectorOnBackgroundThread. - person wickets; 29.05.2011
comment
@toddl, не могли бы вы опубликовать свой рабочий код или руководство, так как я столкнулся с аналогичной проблемой для установки индикатора. и я также не очень хорошо знаком с PerformSelectorOnMainThread и с тем, как заставить его работать. - person Janak Nirmal; 21.11.2011
comment
@toddl Привет, не могли бы вы опубликовать полезный код. как вы решили, как я до сих пор не могу решить. какие-нибудь рекомендации, пожалуйста? - person Janak Nirmal; 22.11.2011
comment
@Jennis Если у вас возникла проблема, которая, вероятно, похожа на эту, вам следует открыть новый вопрос с подробным объяснением вашей проблемы и включить ссылку на этот вопрос, если вы считаете это необходимым. - person Deepak Danduprolu; 22.11.2011

Я решил проблему так

     activityIndicatorObject = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

     // Set Center Position for ActivityIndicator

     activityIndicatorObject.center = CGPointMake(150, 250);
     activityIndicatorObject.backgroundColor=[UIColor grayColor];

     // Add ActivityIndicator to your view
     [self.view addSubview:activityIndicatorObject];

     activityIndicatorObject.hidesWhenStopped=NO;

     [activityIndicatorObject startAnimating];
person iSwaroop    schedule 16.09.2014