更改UIViewController视图的框架?

3

无论我尝试什么,我的视图控制器都不会出现在屏幕外(就像我想要的那样),因为我有一个处理程序(菜单),可以将动画从屏幕外移到屏幕上。在意识到(来自其他帖子)我不能在视图出现之前更改视图的框架后,使用这种方法是有道理的:

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//self.view.frame = CGRectInset(self.view.frame, 100, 50);
self.view.frame = CGRectMake(50, 50, 50, 50);
}

但是,它在屏幕上的呈现与任何标准视图控制器一样(0,0,width,height)。

该如何解决?

3个回答

10

你有willLayoutSubviews方法或者viewDidLayoutSubviews方法

用于通知视图控制器其视图即将布局其子视图。当视图的边界发生变化时,视图会调整其子视图的位置。

因此,不要在视图出现时执行此操作,而是重写willLayoutSubviews方法。

-(void)viewWillLayoutSubviews{

    [super viewWillLayoutSubviews];

      [self.view setFrame:CGRectMake(100, 100, 100, 100)];

}

这个确实有效,所以我标记它为答案。只是在我的情况下不起作用:( 我仍然在努力处理自定义动画:http://stackoverflow.com/questions/33175681/custom-transition-not-working-optimal-presentviewcontrollercompletion-delayed - DevilInDisguise

0
你有没有考虑把所有的视图都添加到另一个作为容器的视图中,然后再将这个容器视图添加到你的视图控制器的视图中?这样,在它出现之前,你就可以自由地定位这个容器视图了。

0

您可以访问ViewControllers视图属性并在loadView()中设置它,这样它只会被设置一次,因此不会破坏任何自定义动画。

当视图控制器的视图属性被请求但当前为nil时,该视图控制器调用此方法。此方法加载或创建视图并将其分配给视图属性。

因为viewWillLayoutSubviews()会在每次布置子视图时设置框架。

override func loadView() {
    super.loadView()
    self.view.frame = CGRect(x: self.view.bounds.origin.x,
    y: self.view.bounds.origin.y,
    width: self.view.bounds.width,
    height: self.view.bounds.height * 0.8 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接