7

私のアプリには 2 つの異なる状態があり、すべての状態は NSView で表されます。

一度に表示されるビューは1つだけです。問題は、ビューを切り替えたときに、ウィンドウのサイズを手動で変更するまで、アプリが新しい状態を表示しないことです!

この問題について検索したところ、複数の解決策がありましたが、何もうまくいきませんでした:

[myView setNeedsDisplay:YES];
[myView display];
[[myView.window contentView] setNeedsDisplay:YES];


[mySubView1 setHidden:YES]; || [mySubView1 removeFromSuperView];

myView を Outlet として定義しましたが、何も機能しません。

これが私のコードです

if (appState == 1) {

    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];

    [self.mySubView1 setHidden:NO];
    [self.mySubView2 setHidden:YES];

    [self.mySubView2 removeFromSuperview];
    [self.mySubView1 addSubview:self.inCallView];
}
else
{
    [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];

    [self.mySubView1 setHidden:YES];
    [self.mySubView2 setHidden:NO];

    [self.mySubView1 removeFromSuperview];
    [self.mySubView2 addSubview:self.chatHeaderView];
}
// I need to redraw here
[self.view setNeedsDisplay:YES];
[self.mySubView1 setNeedsDisplay:YES];
[self.mySubView2 setNeedsDisplay:YES];
// and nothing happened until I resize my window manually 
4

2 に答える 2

8

私はそれを見つけました、コードは問題なく、再描画メソッドを呼び出す必要はありません.唯一の問題は、メインスレッドでUIアクションを実行する必要があることです.

したがって、最終的なコードは次のようになります。

dispatch_async( dispatch_get_main_queue(), ^{
    if (appState == 1) {
        [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 250)];

        [self.mySubView1 setHidden:NO];
        [self.mySubView2 setHidden:YES];
    }
    else
    {
        [self.splitView setFrameSize:CGSizeMake(self.splitView.frame.size.width, self.view.frame.size.height - 70)];

        [self.mySubView1 setHidden:YES];
        [self.mySubView2 setHidden:NO];
    }
});

みんなありがとう。

于 2013-11-13T10:13:59.823 に答える
2

サブビューの削除または追加操作を実行すると自動的に呼び出さsetNeedsDisplay:YESれるため、手動で呼び出しても効果がないことは驚くことではありません。

いくつかの確認事項:

  1. ビューのプロパティで nil 値を確認してください。スーパービューがそれを解放する原因となるビューを削除していることがわかります。強力なプロパティ(または他の場所)でそれを保持していない場合、割り当てが解除されます。
  2. 自動レイアウトと戦っていないことを確認してください。自動レイアウトを一時的にオフにして、問題が発生していないことを確認します。
  3. フレームサイズのみを設定しています。期待されるオリジンも持っていることを確認する必要があります。

また、ビューを削除する場合は、わざわざ呼び出す必要はありませんsetHidden:

于 2013-11-12T17:28:04.647 に答える