在我的viewDidLoad
中,我调用了一个函数:
[common startActivityIndicatorOnView:self.view];
此方法在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];
}
答案 0 :(得分:0)
加载viewControllers时调用ViewDidLoad(通过nib / xib或在loadView方法中以编程方式创建),这意味着xcode创建所有视图并实例化并分配xib中的所有对象...
但是,你的viewController视图(和子视图)仍未添加到任何视图......
yourViewController.view.superView = nil;
所以,它的视图有你在xib中设置的帧,但如果你告诉它在超级视图中调整大小,当你添加它时(例如使用push或addsubview),它的帧会改变,但你的 旋转器不会改变它的位置。
调用performSelectorOnMainThread只是稍后调用你的方法,当你的当前线程提前一步并且可能已经推送了你的viewController.view,因此,当你执行时,你的ViewController.view.superView存在,所以view.frame已经改变了。 / p>
尝试将您的电话转移至
[common startActivityIndicatorOnView:self.view];
在viewWillAppear方法中的:此时你的viewController.view应该已经调整大小以适应它的superView
修改强>
@ pavel问题:
在什么时候你的ViewController.view.superView将不是nil?
平庸地:将视图添加到视图中时。也就是说,你分配并初始化它(使用nib或通过代码初始化)
类似的东西:
yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil];
此时调用类中的方法viewDidLoad
(但是你的ViewController.view.superview 0 nil)
稍后,您通常会使用新的viewController,因此您可以在navigationController的堆栈中“推送”它,或者只是将其视图添加到当前的viewController.view ...类似于:
[currentViewController.view addSubview:yourViewController.view];
在这一行之后,如您所想,调用yourViewController.view.superView = currentViewController.view和yourViewController的方法viewWillAppear
,因此您可以在其中使用superView。
请注意,此时您的viewController.view仍然无法在屏幕上显示,因此您可以在此处调整尺寸,移动或添加视图,而无需用户看到任何更改。
之后,yourViewController将显示,最后,调用yourViewController的方法viewDidAppear
(对于任何其他代码,以防万一)