Анимации внутри макета Subviews? - PullRequest
1 голос
/ 23 января 2012

У меня есть представление (LSTabBarView), которое поддерживает вставку / удаление новых элементов следующими методами:

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

LSTabItem - это объект, представляющий класс моей модели. Каждый раз, когда новый элемент добавляется с помощью insertItem: atIndex: animated: создается новое подпредставление (LSTabControl) с использованием информации внутри этого объекта модели, затем добавляется в главное представление, и, наконец, вызывается layoutSubviews для пересчета кадра каждого элемента. подвиды.

Я только что реализовал эти операции, но параметр "animated" на данный момент не используется, и Мне было интересно, куда мне поместить код для обработки анимации, когда animated - 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 Ответ

1 голос
/ 23 января 2012

layoutSubviews предназначен для быстрого однократного применения. Лучше используйте insertItem: для анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...