2012-01-27 3 views
2
  • の1カ月のカレンダービューを表示するためのUIControlサブクラスを作成しました。ほとんどの月は日付を表示するのに5週間必要ですが、 には6ヶ月が必要なので、必要に応じて を動的にサイズ変更するコントロールを作成しました。 UIViewアニメーションを使用して、 のフレームを変更します。
  • 問題は、今、画面上の他のコントロールが必要です。 カレンダーのサイズが変更されたときに移動/サイズ変更してください。そして、私は本当に カレンダーコントロールのアニメーションのサイズを変更する必要があります。 理想的には、私はカレンダーの細かい部分を、画面上の他のコントロールについてのコントロール の制御なしにコーディングすることなく、これを行うでしょう。
  • ここで最善の戦略は何ですか?私はどうにかして 他のコントロールをカレンダーコントロールのフレームに固定し、 プラットフォームでフレームの変更をアニメートするときに、その位置/サイズを調整することができることを期待していました。 しかし、これまでのところ、私はストラットとバネの組み合わせを見つけることができません それが起こる。
  • 私は、弾丸を噛んで、私のカレンダーコントロール内で起こっているアニメーションに という他の画面上のコントロールを追加するだけでいいですか?

答えて

0

これにはより良い回答があるかどうかを確認することになります。

私が知っていることは、あなたのカレンダービューでオーバーライドsetFrameであり、それが変更されたら、setNeedsLayoutをそのスーパービューに送ってください。

標準ビューでこれを正しく自動サイズ変更するかどうかはわかりません。一般的に、ジオメトリはビューツリーの下に流れますが、上には流れません。両方向で行う必要があります。

あなたは包含ビューでlayoutSubviewsを実装する必要があるかもしれません。

0

アニメーションロジックを特定のビューからすべてのコントロールを管理するビューコントローラに移動します。ビューはそれ自身の適切なサイズを把握して、ビューコントローラに依頼します。

[self.calendarView setDate:date]; 
CGSize calendarSize = [self.calendarView sizeForDate:date]; 
[UIView animateWithDuration:... 
     animations:^{ 
     ... re-layout everything, including the calendarView ... 
     }]; 

別の、同様のアプローチ:例えば

[self.calendarView setDate:date]; 
[UIView animateWithDuration:... 
     animations:^{ 
     [self.calendarView sizeToFit]; 
     ... re-layout everything else ... 
     }]; 

あなたの好みに基づいて、同様のアプローチがたくさんあります。しかし、そのキーは、特定のビューからロジックを移動することです。通常は、ビューコントローラが最適なソリューションです。コントロールが単一のUIViewに入る論理的なコレクションを作成する場合、その "コレクション" UIViewlayoutSubviewsで同じものを管理することができますが、ここではビューコントローラーを使用する方が良い方法です。

0

ありがとうございました。私はこれらのアプローチを両方とも成功させてみました。 setFrameのオーバーライドとlayoutSubviewsの実装は機能しましたが、他のコントロールは、カレンダーコントロールの成長に伴い、それらの場所にアニメートするのではなく、新しい場所にジャンプしました。

アニメーション中に他のコントロールを移動させるアプローチは、私が行かなければならなかったものです。しかし、私はコントロールのロジックをそのまま再利用するために自己完結型にしたかったので、アニメーションをコントロールに残しましたが、サイズ変更に反応する代理人を追加し、デリゲートの呼び出しをアニメーションブロック内に入れました。完全な開示では、新しい月のカレンダーをコントロールにアニメーション化していますが、私はコントロールを拡張しています。このようにして、アニメーションブロックでこれらの両方を実行できます。

// inside the calendar control: 
[UIView animateWithDuration:0.5 animations:^{ 
    self.frame = newOverallFrame; // animate the growth of the control 
    _offScreenCalendar.frame = newOnScreenFrame; // animate new month on screen 
    _onScreenCalendar.frame = newOffScreenFrame; // animate old month off screen 
    if (self.delegate) 
    { 
     [self.delegate handleCalendarControlSizeChange:newOverallFrame]; // animate other controls per the delegate 
    } 
}]; 

ので、終了コードは次のようになります

関連する問題