0

コントローラーには、progressLineView と buttonsView という 2 つの UIView メンバーがあります。ある時点で、このメソッドを呼び出します。

- (void) drawPlayProgressLine{

    progressLineView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height)];
    progressLineView.backgroundColor = [UIColor whiteColor];
    [buttonsView addSubview:progressLineView];

}

すべてが正常に機能し、ビューの位置を変更するメソッドもあります。

- (void) moveProgressLine{

    CGRect frame = progressLineView.frame;
    frame.origin.x++;
    progressLineView.frame = frame;
}

メソッドが数回呼び出された後、ビューを開始位置に完全に移動するのではなく、もう一度moveProgressLine呼び出したいと思うと、新しいビューが作成されます。drawPlayProgressLine呼び出されるほどdrawPlayProgressLine、画面に表示されるビューが増えますが、必要なのは 1 つだけです。

オブジェクトを 1 つだけ作成しているときに、これがどのように発生するのかわかりません。毎回新しいビューを作成する代わりに、ビューを移動するにはどうすればよいですか? そして別の質問: どうすればそれを完全に削除できますか (drawPlayProgressLineメソッドが呼び出されて再度作成されるまで)

4

3 に答える 3

0

作成する前に、まだ作成されているかどうかを確認し、必要に応じて移動する必要があります。

- (void) drawPlayProgressLine{

    if(progressLineView == nil)
    {
        progressLineView = [[UIView alloc] init];
        progressLineView.backgroundColor = [UIColor whiteColor];
        [buttonsView addSubview:progressLineView];
    }

    progressLineView.frame = CGRectMake(0.0, 0.0, 1, buttonsView.frame.size.height);


}
于 2012-08-20T19:58:44.667 に答える
0

親ビューを無効にしていない可能性があります。新しいオブジェクトは作成されませんが、オブジェクトを移動した後、プレゼンテーションは画面に残ります。

2番目の質問について:

[progressLineView removeFromSuperview]; 
[progressLineView release];  
progressLineView = nil;
于 2012-08-20T20:04:18.583 に答える
0

オブジェクトを 1 つだけ作成しているときに、これがどのように発生するのかわかりません。

メソッドを呼び出すたびに新しいビューを作成します-drawPlayProgressLine。10 回呼び出すと、10 回のビューが得られます。

毎回新しいビューを作成する代わりに、ビューを移動するにはどうすればよいですか?

を介して毎回ビューを作成しないでください-drawPlayProgressLine。代わりに、次のいずれかを実行できます。

  • progressLineViewビュー コントローラーのビュー階層が作成されるときに、1 回作成します。-viewDidLoadそんな方にぴったりの場所です。

  • の値を確認し、progressLineView現在 nil の場合にのみ作成します。

どちらを選択してprogressLineViewも、 がインスタンス変数であると仮定すると、メソッドで行っていることを正確に行うことができます-moveProgressLine。つまり、progressLineView既に存在するかのように使用してください。ところで、ビューを移動する簡単な方法は、そのcenterプロパティを変更することです:

CGPoint *c = progressLineView.center;
c.x += 25.0;
progressLineView.center = c;

そして別の質問: どうすれば完全に削除できますか ( drawPlayProgressLine メソッドが呼び出されて再度作成されるまで)

1 つの方法は、ビューを使用していないときは単にビューを非表示にすることです。もう 1 つは、それをスーパー ビューから削除し (保持している場合は解放し)、次に yourprogressLineViewを nil に設定することです。したがって、progressLineViewが ivar の場合は、次のようにします。

[progressLineView removeFromSuperview];
[progressLineView release];              // if you're not using ARC and have retained it
progressLineView = nil;
于 2012-08-20T20:20:10.993 に答える