1

次のメソッドで新しい要素の挿入/削除をサポートするビュー (LSTabBarView) があります。

- (void)insertItem:(LSTabItem *)item atIndex:(NSUInteger)index animated:(BOOL)animated; 
- (void)removeItemAtIndex:(NSUInteger)index animated:(BOOL)animated;

LSTabItem は、モデル クラスを表すオブジェクトです。insertItem:atIndex:animated を使用して新しい要素が追加されるたびに、このモデル オブジェクト内の情報を使用して新しいサブビューが作成され (LSTabControl)、メイン ビューに追加され、最後に layoutSubviews が呼び出されて各フレームが再計算されます。サブビュー。

これらの操作を実装したばかりですが、「アニメーション化」パラメーターは今のところ使用されていません。

関連するメソッドは次のとおりです。

- (void)insertItem:(LSTabItem *)item 
           atIndex:(NSUInteger)index 
          animated:(BOOL)animated 
{
    ...
    LSTabControl *tab = [self _configureNewTabControlForItem:item atIndex:index];
    [tabItems insertObject:item atIndex:index]; 
    [tabViews insertObject:tab atIndex:index]; // array which contains all the subviews

    [self setNeedsLayout];
}

- (void)removeItemAtIndex:(NSUInteger)index 
                 animated:(BOOL)animated 
{
    ...
    LSTabControl *tab = [tabViews objectAtIndex:index];
    ...
    [tab removeFromSuperview];

    [tabViews removeObjectAtIndex:index];
    [tabItems removeObjectAtIndex:index];

    [self setNeedsLayout];
}

layoutSubviews が行うことは、基本的に、各サブビュー間にパディングを適用して、すべてのサブビューを線形水平シーケンスに次々と配置することです。各サブビューは、異なる幅または高さを持つことができます (固定サイズではありません)。アニメーションを YES に設定して新しい要素を追加すると (index=2 としましょう)、index+1 から numberOfElements までの各サブビューが右にシフトされ、新しいサブビューが利用可能な穴に表示されます。

明らかに LSTabBarView を拡張可能にしたいので、これらのメソッドの基本実装では、サブクラスによってサブビューがどのように配置されるかについて仮定を立てることはできません (たとえば、サブクラスが layoutSubviews をオーバーライドし、要素を水平レイアウトではなく垂直レイアウトに配置することを決定する場合があります)。その結果、新しい要素を追加するときに、各サブビューを右ではなく下にシフトすることにしました...)

アニメーションの実行方法を知りたくありません (方法は既に知っています) が、上記の要件を考慮して、新しいサブビューの外観をアニメーション化する正しいアプローチは何ですか。

すべてのアニメーションをlayoutSubviews内で実行するか、アニメーションコードをinsertItem/removeItem内に配置して、layoutSubviewsがサブビューレイアウトを計算できるようにすることを検討する必要がありますか?

ありがとう

4

1 に答える 1

1

layoutSubviewsワンショットクイックメソッドであることを意味します。insertItem:アニメーションに使用することをお勧めします。

于 2012-01-23T15:04:08.647 に答える