0

含まれているビュー コントローラーを試していますが、最も単純なフォームでも問題が発生しています。基本的に、下の 90 ピクセルが切り取られていますが、その理由はわかりません。

コードと、横に同様のサイズの UIView があるスクリーンショットを含めました。この 90 ピクセルclippingは、さまざまなサイズで一貫しています (つまり、高さを 200 ピクセルにすると、110 ピクセルとして表示されます)。これは非常に苛立たしいものになっているので、どんな助けもいただければ幸いです。このサイズになっているのはなぜですか? また、どのように修正すればよいですか?

thx事前に

- (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)アニメーション; これが呼び出されると、境界が設定されます (スーパービューなどによるフレームを介して)。ビューが「ロード」されるのはおそらく 1 回だけですが、頻繁に表示されたり消えたりする可能性があります。したがって、実際にviewDidLoadに入れたいものをこのメソッドに入れないでください。そうしないと、不必要に何かを繰り返している可能性があります。これを使用して、このメソッドまで (つまり、ビューが表示される直前) 待機してコストのかかる操作を開始することにより、パフォーマンスを最適化します (ただし、回転する「読み込み」アイコンを表示する必要がある場合があります)。

理解を深めるには、スタンフォード大学の講義と Apple docの「ディスプレイ関連の通知への対応」を参照してください。

したがって、サブビュー フレームの設定を- (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

Interface Builderを使用していました。

したがって、修正は、含まれているViewControllerからウィンドウを削除し、UIViewを追加して、それをファイルの所有者のビューに設定することであるように見えました。おそらくUIWindowを気にしないことを学んだでしょうが、この場合、UIWindowを気にする必要があります。

于 2013-02-28T15:50:32.213 に答える