layoutSubviews里面的动画?

时间:2012-01-23 11:28:59

标签: ios uiview uiviewanimation layoutsubviews

我有一个视图(LSTabBarView),它支持使用以下方法插入/删除新元素:

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

LSTabItem是表示我的模型类的对象。每次使用insertItem添加新元素时:atIndex:animated:使用此模型对象内部的信息创建新的子视图(LSTabControl),然后添加到主视图,最后调用layoutSubviews重新计算每个元素的帧子视图。

我刚刚实现了这些操作,但现在还没有使用“动画”参数,我想知道在动画为YES时我应该把代码放在哪里处理动画。

以下是相关方法:

- (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只是为了计算子视图布局?

由于

1 个答案:

答案 0 :(得分:1)

layoutSubviews意味着一次快速的方法。最好将insertItem:用于动画。