2011-12-07 135 views
4

在我的故事板中,我有一个UIWebView的视图,它填充除了选项卡和导航栏以外的整个区域。该视图的控制器实现了UIWebViewDelegate协议。该控制器设置为委托的一个UIWebView:UIWebView:加载时显示图像

#pragma mark - UIWebViewDelegate 
- (void) webViewDidStartLoad:(UIWebView *)webView { 
    NSLog(@"webViewDidStartLoad"); 
} 

- (void) webViewDidFinishLoad:(UIWebView *)webView { 
    NSLog(@"webViewDidFinishLoad"); 
} 

虽然UIWebView装我会显示一个黑色的背景图像,说明它加载。我怎样才能做到这一点?

EDIT1: 我想添加默认ActivityIndicatorView,而不是静态图像。但这只是给我一个黑色的背景和一个白色的小区域。问题是什么?

UIImageView *loadingImageView = [[UIImageView alloc] initWithFrame:webView.frame]; 
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
UIImage *spacer = [UIImage imageNamed:@"spacer"];  
UIGraphicsBeginImageContext(spinner.frame.size); 
[spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)]; 
UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
loadingImageView.image = resizedSpacer; 
[loadingImageView setBackgroundColor:[UIColor blackColor]]; 
[loadingImageView setContentMode:UIViewContentModeCenter]; 
self.loadingImageView = loadingImageView; 

回答

26

在您的控制器的.h

@property (nonatomic, retain) UIImageView *loadingImageView; 

在您的控制器的.m

@synthesize loadingImageView; 

- (void)viewDidLoad { 

    ... 

    UIImageView *theLoadingImageView = [[UIImageView alloc] initWithFrame:webView.frame]; 
    theLoadingImageView.image = [UIImage imageNamed:@"your_image.png"]; 
    self.loadingImageView = theLoadingImageView; 
    [theLoadingImageView release]; 

    ... 
} 

- (void) webViewDidStartLoad:(UIWebView *)webView { 

    [self.view addSubview:self.loadingImageView]; 
} 

- (void) webViewDidFinishLoad:(UIWebView *)webView { 

    [self.loadingImageView removeFromSuperview]; 
} 

编辑1:

如果你想显示的ActivityIndi​​catorView代替一个静态图像,这里是我喜欢使用的一个小帮手类:

LoadingIndicator.h

#import <UIKit/UIKit.h> 


@interface LoadingIndicator : UIView { 

    UIActivityIndicatorView *activityIndicator; 
    UILabel *labelMessage; 

} 

@property(retain) UIActivityIndicatorView *activityIndicator; 
@property(retain) UILabel *labelMessage; 

- (id)init; 
- (void)show:(NSString *)theMessage; 
- (void)hide; 
- (void)refreshPosition; 

@end 

LoadingIndicator.m

#import "LoadingIndicator.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation LoadingIndicator 

@synthesize labelMessage, activityIndicator; 

- (id)init {  
    if (self = [super initWithFrame:CGRectMake(25, 130, 270, 100)]) { 

     // Vue 
     self.backgroundColor = [UIColor blackColor]; 
     self.alpha = 0.80; 
     self.layer.cornerRadius = 5; 

     // Label : message 
     UILabel *theLabelMessage = [[UILabel alloc] initWithFrame:CGRectMake(15, 65, 240, 20)]; 
     theLabelMessage.backgroundColor = [UIColor clearColor]; 
     theLabelMessage.textColor = [UIColor whiteColor]; 
     theLabelMessage.text = NSLocalizedString(@"Loading", @"Loading"); 
     theLabelMessage.textAlignment = UITextAlignmentCenter; 
     theLabelMessage.font = [UIFont boldSystemFontOfSize:16]; 
     theLabelMessage.adjustsFontSizeToFitWidth = YES; 

     self.labelMessage = theLabelMessage; 
     [self addSubview:theLabelMessage]; 
     [theLabelMessage release]; 

     // Activity Indicator 
     UIActivityIndicatorView *theActivityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
     theActivityIndicator.frame = CGRectMake(115, 15, 40, 40); 

     self.activityIndicator = theActivityIndicator; 
     [self addSubview:theActivityIndicator]; 
     [theActivityIndicator release]; 

    } 
    return self; 
} 

- (void)show:(NSString *)theMessage { 

    self.labelMessage.text = theMessage; 
    [self.activityIndicator startAnimating]; 
    self.hidden = NO; 
    [self.superview bringSubviewToFront:self]; 
     [self refreshPosition]; 
} 

- (void)hide { 
    [self.activityIndicator stopAnimating]; 
    self.hidden = YES; 
} 

- (void)refreshPosition { 

    self.center = self.superview.center; 
} 

- (void)dealloc { 
    self.labelMessage = nil; 
    self.activityIndicator = nil; 

    [super dealloc]; 
} 

@end 

然后在你的view.h

#import <UIKit/UIKit.h> 
#import "LoadingIndicator.h" 


@interface YourView : UIView { 

    LoadingIndicator *loadingIndicator; 

} 

@property(retain) LoadingIndicator *loadingIndicator; 

- (void)showLoadingIndicator:(NSString *)theMessage; 
- (void)hideLoadingIndicator; 

@end 

在你view.m

#import "YourView.h" 


@implementation YourView 

@synthesize loadingIndicator; 


- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 

     ... 

     // Add your UIWebView etc 

     ... 

     // Loading Indicator 
     LoadingIndicator *theLoadingIndicator = [[LoadingIndicator alloc] init]; 
     theLoadingIndicator.hidden = YES; // Hidden by default 

     self.loadingIndicator = theLoadingIndicator; 
     [self addSubview:theLoadingIndicator]; 
     [theLoadingIndicator release]; 

     ... 


    } 
    return self; 
} 

- (void)showLoadingIndicator:(NSString *)theMessage { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self.loadingIndicator performSelectorOnMainThread:@selector(show:) withObject:theMessage waitUntilDone:NO]; 

    [pool release]; 
} 

- (void)hideLoadingIndicator { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    [self.loadingIndicator performSelectorOnMainThread:@selector(hide) withObject:nil waitUntilDone:NO]; 

    [pool release]; 
} 

- (void)dealloc { 
    self.loadingIndicator = nil; 

    [super dealloc]; 
} 


@end 

最后在你的WebView委托:

- (void) webViewDidStartLoad:(UIWebView *)webView { 

    [(YourView *)self.view showLoadingIndicator:@"Loading"]; 
} 

- (void) webViewDidFinishLoad:(UIWebView *)webView { 

    [(YourView *)self.view hideLoadingIndicator]; 
} 

这将是这个样子:

enter image description here

+0

请检查我的'EDIT1'。 – dhrm

+0

好的,我也编辑了我的答案:) – Mutix

+1

+1,令人沮丧的是这还没有被提升。 –

0

您只需在UIWebViewDelegate方法中隐藏并取消隐藏包含所需消息的加载图像。

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    loadingView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"loading image.png"]]; 

    loadingView.center = CGPointMake(x, y); 

    [webView addSubview:loadingView]; 

} 

- (void)webViewDidFinishLoad:(UIWebView *)webView1 

{ 
    loadingView.hidden = YES; 

} 


- (void)webViewDidStartLoad:(UIWebView *)webView1 

{ 

    loadingView.hidden = NO; 

} 
相关问题