2

対応する .xib ファイルを持つ単純な UIViewController があります。

ViewController *v = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:v animated:YES];

この .xib ファイルには、画面の中央に配置された UILabel があります。ビューがロードされたら、このラベルを新しい位置に移動したいと思いますが、表示される前に:

label.center = CGPointMake(0,0);

上記のコードを次のメソッドに入れようとすると、次のようになります。

  • initWithNibName:bundle: 位置は更新されません
  • awakeFromNib: 位置は更新されません
  • viewDidLoad: 位置は更新されません
  • viewWillAppear: 位置は更新されません
  • viewDidAppear: 位置は、ビューが完全にロードされた後にのみ更新されます (つまり、ラベルの元の位置が一瞬表示されます)。

text プロパティのようなものを更新しようとすると:

label.text = @"Foo";

...これらすべての方法で機能します。何らかの理由で、.xib ファイルによって上書きされるのはその位置だけです。

「位置が更新されない」と言うときは、ラベルが画面に表示されたときに、上書きしようとしている場所ではなく、.xib ファイルで定義された場所にあることを意味します。

位置を変更しようとするとNSLog、正しく更新されていることが示されますが、 で再度位置を確認するとviewDidAppear、正しくない値が表示されます。たとえば、.xib が x を 99 で定義していて、それを 0 に変更したいとします。

- (void)viewWillAppear:(BOOL)animated {
    label.center = CGPointMake(0,0);
    NSLog(@"%f", label.center.x); // reports 0
}

- (void)viewDidAppear:(BOOL)animated {
    NSLog(@"%f", label.center.x); // reports 99 (Error: should be 0)
    label.center = resultLabelHiddenCenter;
    NSLog(@"%f", label.center.x); // reports 0
}

ビューが表示される前に、視覚的な不具合なしにラベルの中心を更新するにはどうすればよいですか?

4

1 に答える 1

5

私は、あなたはautoLayoutあなたのxibに使用していると思います。

ここに画像の説明を入力

私はあなたのために2つの解決策を考えています。

最初の 1 つは です。使用しないでください。 setFrameor はそれらをスキップしますsetBoundsAutolayout

制約を変更することが最善の解決策です。追加の制約を追加/削除することもできます。

WWDC 2012 には、調整に関する優れたビデオ チュートリアルがあります。Autolayout

ここに画像の説明を入力

2 つ目はviewDidLayoutSubviews、 View Controller のビューの layoutSubviews メソッドが呼び出された直後に呼び出される,Implementです。

- (void)viewDidLayoutSubviews
{
    @try
    {
         // reset label frame here.
    }
    @catch (NSException *exception)
    {
        NSLog(@"%s\n exception: Name- %@ Reason->%@", __PRETTY_FUNCTION__,[exception name],[exception reason]);
    }
}
于 2013-03-17T07:06:51.037 に答える