2016-06-15 26 views
1

Ich versuche NSCollectionView scrollToIndexPaths:scrollPosition: zu animieren, die gemäß der Dokumentation erreicht werden kann, wenn diese Nachricht an die animator Proxy-Proxy-Ansicht der Sammlungsansicht gesendet wird. Aber ich kann es nicht zur Arbeit bringen.So animieren Sie scrollToIndexPaths von NSCollectionView: scrollPosition :?

Ich habe ein sehr einfaches Projekt eingerichtet, das nur eine Sammlungsansicht enthält und 1000 100x100 Elemente erstellt. Eine einfache Aktion inkrementiert den sichtbaren Indexpfad um 50 und versucht, zu diesem zu scrollen. Mein Scrollen Code wie folgt aussieht:

- (IBAction)increment:(id)sender { 
    NSIndexPath *visibleIndexPath = [[self.collectionView indexPathsForVisibleItems] anyObject]; 
    NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:visibleIndexPath.item + 50 inSection:visibleIndexPath.section]; 
    [self.collectionView.animator scrollToItemsAtIndexPaths:[NSSet setWithObject:toIndexPath] scrollPosition:NSCollectionViewScrollPositionCenteredHorizontally]; 
} 

Dadurch wird die Sammlung im Hinblick auf den Zielindexpfad springt aber animiert nicht. Ich habe dafür gesorgt, dass die Scroll-Ansicht Schicht verstärkt wird, basierend auf einigen der anderen Threads ich dazu gefunden habe:

enter image description here

Der einzige andere Code in das Projekt sind ein paar Zeilen, die einrichten die Sammlung Ansicht und Flow-Layout in viewDidLoad::

// Do any additional setup after loading the view. 
    NSCollectionViewFlowLayout *flowLayout = [[NSCollectionViewFlowLayout alloc] init]; 
    flowLayout.itemSize = CGSizeMake(100.f, 100.f); 
    flowLayout.scrollDirection = NSCollectionViewScrollDirectionHorizontal; 
    self.collectionView.collectionViewLayout = flowLayout; 

    [self.collectionView registerClass:[CollectionViewItem class] forItemWithIdentifier:@"identifier"]; 

Hat jemand in der Lage gewesen, mit scrollToIndexPaths:scrollPosition: zu animieren? Die Dokumentation macht es offensichtlich, aber ich kann es nicht zum Laufen bringen.

Antwort

3

ich konfrontiert mit dem gleichen Problem und verbrachte eine Weile, es zu beheben. Sie haben ein Konzept von impliziten Animationen, die nicht-eigenschaftsändernden Code berücksichtigen. I.e. sieht so aus, als ob Animator bestimmte Eigenschaften animiert, aber keine anderen Layoutänderungen. Damit diese "anderen" Änderungen animiert werden können, müssen Sie implizite Animationen auf den aktuellen Animationskontext zulassen. Hier ist mein Arbeitscode:

Hinweis: Ich habe das Snippet bearbeitet, um neuere Swift-Syntax zu unterstützen.

+0

Perfekt! Das hat den Trick gemacht. Ich denke, ich hätte das herausfinden müssen, wenn ich ein umfassenderes Wissen über Animationen auf OS X hätte, aber ich bin überrascht, dass dies in der Dokumentation nicht erwähnt wurde. – ppilone

+0

Meine Güte, ich bin verrückt nach diesem blöden Thema. Gott sei Dank, dass ich deine Antwort hier gefunden habe! Genial! – JFS