1

在我的 iphone 应用程序中,在调用 web 服务时会显示一个活动指示器。我的问题是我可以触摸显示活动指示器的视图。我的视图有文本字段和按钮,我可以在文本字段中输入值,还可以在活动指示器仍在其上时更改按钮状态. 有没有人遇到过类似的情况?有人知道这个问题的解决方案吗?欢迎所有有用的建议。这是我的活动指标类。

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

I also call the activity indicator while exporting audio. This is the code I use for exporting

    -(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:&finalurlError];
                    finalurlError = nil;
                    [[NSFileManager defaultManager]copyItemAtPath:[exportURL path] toPath:recorderFilePath error:&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];
}
4

1 回答 1

4

You're adding your activity indicator to the middle of another view, yes?

If so, you can do this in your show method:

self.superview.userInteractionEnabled = NO;

And in your close method:

self.superview.userInteractionEnabled = YES;

Here is where you'll find information on the UIView's userInteractionEnabled property: http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/userInteractionEnabled

Hope this helps!

于 2011-10-30T09:45:16.910 回答