Возможность прикоснуться к фону индикатора активности

#iphone #objective-c #ios #uiactivityindicatorview #activity-indicator

#iPhone #objective-c #iOS #uiactivityindicatorview #индикатор активности

Вопрос:

В моем приложении для iPhone индикатор активности отображается во время вызова веб-сервиса. Моя проблема в том, что я могу коснуться представления, на котором отображается индикатор активности.В моем представлении есть текстовые поля и кнопки, и я могу вводить значения в текстовые поля, а также изменять состояния кнопок, пока индикатор активности все еще включен. Кто-нибудь сталкивался с подобной ситуацией? Кто-нибудь знает решение этой проблемы? Все полезные предложения приветствуются. Вот мой класс индикаторов активности.

ActivityProgressViewController.h

 #import <UIKit/UIKit.h>

@interface ActivityProgressViewController : UIViewController {
    IBOutlet UIActivityIndicatorView *_activityIndicator;
    IBOutlet UILabel *_labelMessage;
    NSString *_messageToShow;
}

@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
@property (nonatomic, retain) IBOutlet UILabel *labelMessage;

  (ActivityProgressViewController*) createInstance;

- (void)show;
- (void)showWithMessage:(NSString*)message;
- (void)close;


  (void)show;
  (void)close;

@end
 

ActivityProgressViewController.m

 #import "ActivityProgressViewController.h"

#define kACTIVITY_INDICATOR_NIB @"ActivityProgressViewController"

@implementation ActivityProgressViewController

@synthesize activityIndicator = _activityIndicator;
@synthesize labelMessage = _labelMessage;


static ActivityProgressViewController *_viewController;


- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
}

- (void)viewDidLoad {
    if (_messageToShow) _labelMessage.text = _messageToShow;
}

- (void)dealloc {
    [_labelMessage release];
    [_messageToShow release];
    [_activityIndicator release];
    [super dealloc];
}

  (ActivityProgressViewController*) createInstance {
    _viewController = [[ActivityProgressViewController alloc] initWithNibName:kACTIVITY_INDICATOR_NIB bundle:nil];
    return _viewController;
}

- (void)show
{
    [_activityIndicator startAnimating];

    UIWindow *window = [[[UIApplication sharedApplication] windows]objectAtIndex:0];
    NSLog(@"[[UIApplication sharedApplication] windows]===%@",[[UIApplication sharedApplication] windows]);

    self.view.frame = CGRectMake(window.bounds.origin.x, window.bounds.origin.y, window.bounds.size.width, window.bounds.size.height);

    [window addSubview:self.view];

}



- (void)showWithMessage:(NSString*)message {
    _messageToShow = message;
    [self show];
}

- (void)close
{
    [self.view removeFromSuperview];

}

  (void)show {
    if (!_viewController) {
        _viewController = [ActivityProgressViewController createInstance];
    }
    [_viewController show];
}

  (void)close {
    if (_viewController) {
        [_viewController close];
    }
}

@end
 

Вот как я звоню из своего нужного класса.

  [ActivityProgressViewController show];

 [ActivityProgressViewController close];
 

Я также вызываю индикатор активности при экспорте аудио.
Это код, который я использую для экспорта

     -(void)exportAudioFile:(AVComposition*)combinedComposition
{

[ActivityProgressViewController show];

AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:combinedComposition
                                                                           presetName:AVAssetExportPresetPassthrough];

    NSArray *presets =[AVAssetExportSession exportPresetsCompatibleWithAsset:combinedComposition];

    NSLog(@"presets======%@",presets);
    NSLog (@"can export: %@", exportSession.supportedFileTypes);
    NSArray *dirs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [dirs objectAtIndex:0];
    exportPath = [documentsDirectoryPath stringByAppendingPathComponent:@"CombinedNew.m4a"];
    [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil];
    exportURL = [NSURL fileURLWithPath:exportPath];
    exportSession.outputURL = exportURL;
    exportSession.outputFileType = @"com.apple.m4a-audio";
    exportSession.shouldOptimizeForNetworkUse = YES;
    [exportSession exportAsynchronouslyWithCompletionHandler:^{
        NSLog (@"i is in your block, exportin. status is %d",
               exportSession.status);
        switch (exportSession.status) 
        {
            case AVAssetExportSessionStatusFailed: 
            {

                break;
            }
            case AVAssetExportSessionStatusCompleted: 
            {

                exportSuccess = YES;
                if (recorderFilePath) 
                {
                    NSError *finalurlError;
                    [[NSFileManager defaultManager]removeItemAtPath:recorderFilePath  error:amp;finalurlError];
                    finalurlError = nil;
                    [[NSFileManager defaultManager]copyItemAtPath:[exportURL path] toPath:recorderFilePath error:amp;finalurlError];
                    NSLog(@"finalurlError 2-----%@",finalurlError);
                }
                [ActivityProgressViewController close];
                fileUrl = [NSURL fileURLWithPath:recorderFilePath];  
                [self updatePlayerForUrl:fileUrl];
                break;
            }
            case AVAssetExportSessionStatusUnknown: 
            {   

                break;
            }
            case AVAssetExportSessionStatusExporting: 
            { 

                break;
            }
            case AVAssetExportSessionStatusCancelled: 
            { 

                break;
            }
            case AVAssetExportSessionStatusWaiting: 
            { 

                break;
            }
            default: 
            { 
                NSLog (@"didn't get export status");
                break;
            }

        };
    }];

    [exportSession release];
}
 

Ответ №1:

Вы добавляете свой индикатор активности в середину другого представления, да?

Если это так, вы можете сделать это в своем show методе:

 self.superview.userInteractionEnabled = NO;
 

И в вашем close методе:

 self.superview.userInteractionEnabled = YES;
 

Здесь вы найдете информацию о свойстве userInteractionEnabled в UIView: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/userInteractionEnabled

Надеюсь, это поможет!

Комментарии:

1. Это сработало. Спасибо. Но проблема все еще остается. В моем приложении я также использую этот индикатор активности при экспорте аудиофайлов. Здесь возникает та же проблема.

2. То же самое решение должно работать и там. В какой бы вид вы ни добавили индикатор активности, значение userInteractionEnabled «НЕТ» должно отключать касания до завершения действия.

3. В случае экспорта я заметил, что вызывается [ActivityProgressViewController close] . Но индикатор активности все еще существует после этого, и я могу прикасаться к элементам пользовательского интерфейса фонового представления. Я думаю, что это как-то связано с асинхронным экспортом. Я добавил приведенный выше код экспорта для справки.

4. Есть идеи по этому вопросу?

5. Найдено решение проблемы. Блок exportAsynchronouslyWithCompletionHandler выполняется в фоновом потоке. Поэтому я вызвал метод [ActivityProgressViewController close] в функции updatePlayerForUrl, которая, в свою очередь, выполняется в фоновом режиме с использованием: [self performSelectorInBackground:@selector (updatePlayerForUrl:) С помощью object:fileURL]; Теперь он работает нормально.