Frage

Ich habe eine Ansicht (LSTabBarView), die das Einfügen/Löschen neuer Elemente mit den folgenden Methoden unterstützt:

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

LSTabItem ist das Objekt, das meine Modellklasse darstellt.Jedes Mal, wenn ein neues Element mit insertItem:atIndex:animated hinzugefügt wird:Mithilfe der Informationen in diesem Modellobjekt wird eine neue Unteransicht erstellt (LSTabControl), dann zur Hauptansicht hinzugefügt und schließlich wird layoutSubviews aufgerufen, um den Rahmen jeder Unteransicht neu zu berechnen.

Ich habe diese Operationen gerade implementiert, aber der „animierte“ Parameter wird vorerst nicht verwendet Ich habe mich gefragt, wo ich den Code zur Handhabung der Animation ablegen soll, wenn „animiert“ JA ist.

Dies sind die relevanten Methoden:

- (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];
}

Die Aufgabe von „layoutSubviews“ besteht im Grunde darin, alle Unteransichten nacheinander in einer linearen horizontalen Reihenfolge anzuordnen und zwischen den einzelnen Unteransichten einen Abstand zu schaffen.Jede Unteransicht kann eine andere Breite oder Höhe haben (sie haben keine feste Größe).Wenn ein neues Element hinzugefügt wird, dessen Animation auf JA eingestellt ist (sagen wir bei index=2), möchte ich, dass alle Unteransichten von index+1 bis numberOfElements nach rechts verschoben werden und die neue Unteransicht dann in der verfügbaren Lücke erscheint.

Ich möchte natürlich, dass LSTabBarView erweiterbar ist, daher kann ich in meiner Basisimplementierung dieser Methoden keine Annahmen darüber treffen, wie die Unteransichten nach Unterklassen angeordnet werden (z. B. könnte eine Unterklasse „layoutSubviews“ überschreiben und entscheiden, die Elemente in einem vertikalen Layout statt in einem horizontalen Layout anzuordnen und beschließt daher, beim Hinzufügen neuer Elemente jede Unteransicht nach unten statt nach rechts zu verschieben ...)

Ich möchte nicht wissen, wie man die Animation durchführt (ich weiß bereits, wie man das macht), aber was ist der richtige Ansatz, um das Erscheinungsbild einer neuen Unteransicht unter Berücksichtigung meiner oben beschriebenen Anforderungen zu animieren?

Sollte ich in Erwägung ziehen, alle Animationen innerhalb von „layoutSubviews“ auszuführen, oder den Animationscode in „insertItem/removeItem“ einfügen, sodass „layoutSubviews“ nur das Layout der Unteransichten berechnen kann?

Danke

War es hilfreich?

Lösung

layoutSubviews soll eine schnelle One-Shot-Methode sein.Nutzen Sie besser Ihre insertItem: für Animationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top