2013-04-09 71 views
1

在我viewDidLoad,我调用一个函数:viewDidLoad方法调用行为

[common startActivityIndicatorOnView:self.view]; 

此方法添加与活动指示灯视图,在self.view中心。 我的当前视图被推送到导航堆栈上。这是该视图中查找此方法返回后(活动指示灯的观点是不是在中心): enter image description here

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

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

的观点看起来像下面的图片(活动指示灯的观点是在中心):

enter image description here

我不明白,它是如何有所作为,如果主叫用户线是写在viewDidLoad。 如果有人能帮助我得到这个,请提前致谢。

仅供参考, 的方法是这样的:当你加载viewControllers

-(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

尝试self.navigationController.view代替self.view。 – satheeshwaran 2013-04-09 10:20:15

+0

@Pince我已经知道调用'performSelectorOnMainThread'调用主线程中的方法。但我在'viewDidLoad'中这样做,它本身在主线程中调用。所以,应该没有区别。 – 2013-04-09 11:26:28

回答

0

viewDidLoad中被调用(通过笔尖/厦门国际银行或的loadView方法以编程方式创建的),这意味着Xcode中创建所有视图和实例或Alloc在厦门国际银行的所有对象...

但是,您的viewController视图(和子视图)仍然没有在任何视图中添加...

yourViewController.view.superView = nil; 

因此,它的视图已经获得了您在xib中设置的框架,但是如果您告诉它在其超级视图内调整大小,那么添加它时(例如,推或增加视图),其框架更改,但您的微调不会改变其位置。

调用performSelectorOnMainThread只是稍后调用你的方法,当你的当前线程前进,并可能推动你的viewController.view,所以,执行时,你的ViewController.view.superView存在,所以view.frame已经改变。

尝试将呼叫转移到

[common startActivityIndicatorOnView:self.view]; 

在viewWillAppear中的方法:在这一点上应该yourViewController.view已经被调整大小以适应它的父

编辑:

@帕维尔问题:

之后什么妈咪你的viewcontroller.view.superView将不是零?

banally:当您将其视图添加到视图。也就是说,firts你分配和(用笔尖或通过代码INIT)初始化它

类似:

yourViewControllerInstance = [[YourViewController alloc]initWithNibName:@"yourViewControllerNib" bundle:nil]; 
在这一点上

在你的类中的方法viewDidLoad被称为(但yourViewController.view.superview 0无)

后,您通常使用新的viewController,所以在navigationController的堆栈你“推”,或者你只需​​要添加的查看到当前viewController.view ...类似:

[currentViewController.view addSubview:yourViewController.view]; 

在这一行之后,您可能会想象,yourViewController.view.superView = currentViewController.view,并调用了yourViewController的方法viewWillAppear,因此您可以在其中使用superView。

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

在此之后,yourViewController将显示,并且在结束时,和该方法的yourViewController viewDidAppear被称为(为任何其他代码,万一)

+0

逻辑:)。在viewWillAppear,它的工作。 – 2013-04-09 11:31:45

+0

什么时候你的ViewController.view.superView将不是零? – BergP 2013-04-09 11:37:23

+0

@Pavel:看看我的新广告(给我一分钟) – meronix 2013-04-09 11:41:30