9

我有下面的代码,我在 webview 中加载了一些链接。

- (void)viewDidLoad
{
    mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [self openWebPage:fileName];
    [self.view addSubview:myWebView];
    [self.view addSubview:mySpinner];
    mySpinner.center = CGPointMake(self.view.frame.size.width / 2.0, 100);
}

-(void)openWebPage:(NSString*)address {
    NSURL*url=[NSURL URLWithString:address];
    NSURLRequest*request=[NSURLRequest requestWithURL:url];
    myWebView.scalesPageToFit = NO;

    [myWebView loadRequest:request];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {

    UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error!!!" message:@"Please make sure you are connected to 3G or Wi-Fi." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
    [errorView show];
    mySpinner.hidden = YES;
    [mySpinner stopAnimating];
}


-(void)webViewDidStartLoad:(UIWebView *)webView2 {
    NSLog(@"webViewDidStartLoad");
    mySpinner.hidden = NO;
    [mySpinner startAnimating];
    NSLog(@"step 1");
    NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 2 ];
    [NSThread sleepUntilDate:future];
    NSLog(@"step 2");
}

-(void)webViewDidFinishLoad:(UIWebView *)webView2 {
    NSLog(@"webViewDidFinishLoad");
    mySpinner.hidden = YES;
    [mySpinner stopAnimating];

}

我正在做的是在 webViewDidStartLoad 我正在显示微调器并开始使用 动画 [mySpinner startAnimating];,但它没有旋转。它只是保持原样(没有旋转)。

知道出了什么问题吗?


编辑 1

我有 webview 代表@interface WebDetailsViewController : UIViewController<UIWebViewDelegate>

我还添加了[NSThread sleepUntilDate:future];只是为了验证活动指示器视图是否动画。

下面是我从 NSLog 得到的

2013-06-23 16:29:28.843 GulfLab[2048:907] webViewDidStartLoad
2013-06-23 16:29:28.845 GulfLab[2048:907] step 1
2013-06-23 16:29:30.847 GulfLab[2048:907] step 2
2013-06-23 16:29:31.836 GulfLab[2048:907] webViewDidFinishLoad

编辑 2

好吧好吧,问题出在下面...

[UIView  beginAnimations: @"Showinfo"context: nil];
[UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.75];
[self.navigationController pushViewController: secondView animated:NO];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];
[UIView commitAnimations];

下面是我所拥有的...

一个第一个视图控制器,我有按钮,当我单击这些按钮时,我将进入第二个视图控制器,在那里我根据按下的按钮显示 Web 文件。

我的客户在进入第二个视图时想要一些效果,为此我添加了上面的代码。但正因为如此,我面临着活动问题。

知道我需要做什么改变吗?


经过进一步调查,我发现问题出在这一行......

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO];

但我需要这条线,否则动画不会发生......

今天我也注意到,如果我触摸 webview,它就会开始动画

Grrr...有人帮助我

4

6 回答 6

20

如果有人遇到类似的问题,指示器没有旋转:

确保Animating在情节提要中设置了该属性。

活动指示器动画

于 2015-12-11T15:39:40.840 回答
5

可能因为您不在主 UI 线程上,所以您没有让它动画化。尝试将它添加到主循环上的调度队列以强制它在主循环上并且它应该动画。

dispatch_async(dispatch_get_main_queue(), ^{
    [mySpinner startAnimating];
}];
于 2013-06-23T13:38:15.570 回答
2

尝试将此代码放在 alloc init 之后

mySpinner.hidesWhenStopped = false;
于 2014-01-29T01:13:17.460 回答
0

这就是我在代码中使用微调器弹出弹出窗口的方式。不完全是你问的,但它有点相似。

在您的 *.h 文件中:

@interface v3ViewController : UIViewController 
{
    UIAlertView *megaAlert;
}

@property (nonatomic, retain) UIAlertView *megaAlert;

- (IBAction) invokeMegaAnnoyingPopup;
- (IBAction) dismissMegaAnnoyingPopup;

在您的 *.m 文件中:

@synthesize megaAlert;

- (IBAction) dismissMegaAnnoyingPopup
{
    [self.megaAlert dismissWithClickedButtonIndex:0 animated:YES];
    self.megaAlert = nil;
}

- (IBAction) invokeMegaAnnoyingPopup
{
    self.megaAlert = [[UIAlertView alloc] initWithTitle:@"Please wait..."
                                                message:nil delegate:self cancelButtonTitle:nil
                                      otherButtonTitles: nil];

    [self.megaAlert show];

    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc]
                                          initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

    indicator.center = CGPointMake(130, 70);


    [indicator startAnimating];
    [self.megaAlert addSubview:indicator];
}
于 2013-06-23T16:56:28.137 回答
0

删除代码中的 mySpinner.hidden = YES/NO;

只需添加 [mySpinner setHidesWhenStopped:YES]; 在 viewDidload

然后你就开始和停止。

- (void)viewDidLoad
{
    mySpinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    [mySpinner setHidesWhenStopped:YES];//set Hidden here

    [self openWebPage:fileName];
    [self.view addSubview:myWebView];
    [self.view addSubview:mySpinner];
    [self.view bringSubviewToFront:mySpinner]; //Add if still not show
}
于 2013-06-23T13:33:39.837 回答
0

我真的认为[NSThread sleepUntilDate:future];在这种情况下电话会杀死你。我的大部分代码都与第 3 方硬件集成,这将在某些情况下阻塞主线程,当这种情况发生时,我将有与你类似的行为,其中 UI 的元素出现但处于轻微冻结状态,直到我点击屏幕以“启动”用户界面或阻塞呼叫完成。

如果我是你,我会从摆脱sleepUntilDate呼叫开始,然后删除停止呼叫以mySpinner确保它实际上正在旋转,这样当你遇到更长的呼叫时,webViewDidFinishLoad你会确信它正在工作。

于 2013-06-23T13:56:33.343 回答