1

在我的viewDidLoad中,我调用了一个函数:

[common startActivityIndicatorOnView:self.view];

此方法添加一个带有 Activity 指示器的视图,位于self.view. 我当前的视图被推送到导航堆栈上。这是该方法返回后视图的外观(活动指示器视图不在中心): 在此处输入图像描述

但是,如果我这样调用相同的方法:

[common performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:self.view waitUntilDone:NO];

该视图如下图所示(活动指示器视图位于中心):

在此处输入图像描述

我不明白,如果调用行是用viewDidLoad. 如果有人可以帮助我得到这个,在此先感谢。

仅供参考,该方法如下所示:

-(void) startActivityIndicatorOnView:(UIView *)view {
    if ([NSRunLoop currentRunLoop] != [NSRunLoop mainRunLoop]) {
        [self performSelectorOnMainThread:@selector(startActivityIndicatorOnView:) withObject:view waitUntilDone:NO];
        return;
    }
    view.userInteractionEnabled = NO;
    activityBgView = [[UIView alloc] initWithFrame:CGRectMake((view.frame.size.width/2) - 50, (view.frame.size.width/2) - 50, 100, 100)];
    activityBgView.center = view.center;
    activityBgView.backgroundColor = [UIColor grayColor];
    activityBgView.alpha = 0.8;
    spinner = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake((activityBgView.frame.size.width/2)-10, (activityBgView.frame.size.width/2)-10, 20, 20)];
    spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    spinner.center = view.center;

    [view addSubview:activityBgView];
    [view addSubview:spinner];
    [spinner startAnimating];
}
4

1 回答 1

0

ViewDidLoad 在您加载 viewControllers(通过 nib/xib 或在 loadView 方法中以编程方式创建)时被调用,这意味着 xcode 创建所有视图并实例化和分配 xib 中的所有对象...

但是,您的 viewController 视图(和子视图)仍未添加到任何视图中......

yourViewController.view.superView = nil;

所以,它的视图有你在 xib 中设置的框架,但是如果你告诉它在它的超级视图内调整大小,当你添加它时(例如使用 push 或 addsubview),它的框架会改变,但你的微调器不会改变它的位置。

调用 performSelectorOnMainThread 只会在稍后调用您的方法,当您当前的线程前进并且可能已经推送了您的 viewController.view 时,因此,在执行时,您的 ViewController.view.superView 存在,因此 view.frame 已经更改。

尝试将您的呼叫转移到

[common startActivityIndicatorOnView:self.view];

在 viewWillAppear 方法中:此时 yourViewController.view 应该已经调整大小以适合其 superView

编辑:

@帕维尔问题:

什么时候之后 yourViewController.view.superView 将不为零?

平庸:当您将其视图添加到视图时。也就是说,首先分配并初始化它(使用 nib 或通过代码初始化)

就像是:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil];

此时viewDidLoad调用您类中的方法(但 yourViewController.view.superview 0 nil)

稍后,您通常会使用新的 viewController,因此您将其“推入”navigationController 的堆栈中,或者您只需将其视图添加到当前的 viewController.view... 类似于:

[currentViewController.view addSubview:yourViewController.view];

在这行之后,你可以想象,yourViewController.view.superView = currentViewController.view,并且viewWillAppear调用了yourViewController的方法,所以你可以在里面使用superView。

请注意,此时您的 viewController.view 在屏幕上仍然不可见,因此您可以在此处调整大小、移动或添加视图,而用户不会看到任何更改。

在此之后,yourViewController 将显示,最后,viewDidAppear调用 yourViewController 的方法(对于任何其他代码,以防万一)

于 2013-04-09T10:23:13.247 回答