#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]; Теперь он работает нормально.