0

我正在试验一个包含的视图控制器,但即使是最简单的形式也有问题。基本上,它切断了底部的 90 个像素,我不知道为什么。

我已经包含了我的代码和一个屏幕截图,旁边有一个类似大小的 UIView。这 90 像素clipping在不同大小上是一致的(即,如果将高度设为 200 像素,则显示为 110 像素)。任何帮助将不胜感激,因为这变得非常令人沮丧。为什么它的尺寸是这个尺寸,我该如何解决?

提前谢谢

- (void)viewDidLoad
{
  // this is the left one below that is the problem
   [super viewDidLoad];
   self.myView=[[JtViewController alloc] initWithNibName:@"JtViewController" bundle:nil];
   self.myView.view.frame=CGRectMake(10.0f,10.0f,100.0f,100.0f);
   self.myView.view.backgroundColor=[UIColor orangeColor];
   [self addChildViewController:self.myView];                 // 1
   [self.view addSubview:self.myView.view];
   [self.myView didMoveToParentViewController:self.myView];          // 3


   // this one is ok
   self.testView=[[UIView alloc] init];
   self.testView.frame=CGRectMake(150.0f,10.0f,100.0f,100.0f);
   self.testView.backgroundColor=[UIColor whiteColor];
   [self.view addSubview:self.testView];

在此处输入图像描述

编辑 1

我已经更新了代码,所以前 4 条评论实际上是无关紧要的

编辑 2

@implementation JtViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
4

2 回答 2

2

这是在- (void)viewDidLoad中设置子视图边界的常见错误

- (void)viewDidLoad; 这是放置大量设置代码的绝佳场所。但要小心,因为您的视图的几何形状(其边界)尚未设置。如果您需要根据视图的几何形状初始化某些内容,请使用- (void)viewWillAppear:(BOOL)animated; 方法

- (void)viewWillAppear:(BOOL)动画; 调用此方法时,您的界限已设置(通过您的超级视图或类似的框架)。您的视图可能只会“加载”一次,但它可能会出现和消失很多次。所以不要在这个方法中放入真正想在viewDidLoad中的东西。否则,您可能会一遍又一遍地做一些不必要的事情。通过等待此方法(即在视图出现之前)启动昂贵的操作(尽管可能必须放置一个旋转的“加载”图标),使用它来优化性能。

为了更好地理解,请参阅斯坦福讲座和 Apple 文档Responding to Display-Related Notifications

所以只需将设置子视图框架移动到- (void)viewWillAppear:(BOOL)animated; 方法

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.myView.view.frame=CGRectMake(10.0f,10.0f,100.0f,100.0f);
}

PS我注意到另一个错误(也许只是错字):

[self.myView didMoveToParentViewController:self.myView];

应该:

[self.myView didMoveToParentViewController:self];
于 2013-03-05T08:55:38.397 回答
1

我正在使用界面生成器。

所以修复似乎是从包含的 ViewController 中删除窗口,只需添加一个 UIView 并将其设置为文件所有者的视图。可能学会了从不担心 UIWindow,但在这种情况下,您必须担心 UIWindow。

于 2013-02-28T15:50:32.213 回答