2015-11-04 9 views
5

Gibt es eine Möglichkeit, das automatische Scrollen von UICollectionView zu deaktivieren, wenn die Zelle fokussiert wird? Ich möchte den Inhalt Offset der Zelle manuell anpassen, wenn es in den Fokus kommt.Fokus-ausgelöste Scrolling von UICollectionView deaktivieren

I wan't den Inhalt im Offset zu aktualisieren:

- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context 
     withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator 
{ 
    [coordinator addCoordinatedAnimations:^ 
    { 
     [UIView animateWithDuration:[UIView inheritedAnimationDuration] 
          animations:^ 
      { 
       // Move next focused cell. 
       if ([context.nextFocusedView isKindOfClass:[YBZEventCollectionViewCell class]]) 
       { 
        UICollectionViewCell *cell = (UICollectionViewCell *)context.nextFocusedView; 

        CGPoint offset = CGPointMake(CGRectGetMinX(cell.frame), 0.0f); 

        [_collectionView setContentOffset:offset]; 
       } 
      }]; 

    } completion:nil]; 
} 

Das funktioniert aber da der Fokus Motor meine Zelle bewegt sich auch (scrollt es) ich mit Animation am Ende, die nicht glatt ist, es ist ein "Kick" am Ende davon.

Antwort

-1

Ich weiß nicht, was Sie mit 'automatischem Scrollen' meinen, aber um eine Sammelansicht Zelle zu ändern, könnten Sie die didUpdateFocusInContext in Ihrer benutzerdefinierten Zellklasse verwenden.

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    coordinator.addCoordinatedAnimations({ [unowned self] in 
     if self.focused { 
      self.titleTopConstraint.constant = 27 

      self.titleLabel.textColor = UIColor.whiteColor() 
     } else { 
      self.titleTopConstraint.constant = 5 

      self.titleLabel.textColor = UIColor(red: 100/255, green: 100/255, blue: 100/255, alpha: 1) 
     } 
     self.layoutIfNeeded() 
    }, completion: nil) 
} 

Oder wenn Sie keine eigene Zelle haben, verwenden Sie die didUpdateFocusInContext vom UICollectionViewDelegate.

func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    coordinator.addCoordinatedAnimations({() -> Void in 
     if let indexPath = context.nextFocusedIndexPath, let cell = collectionView.cellForItemAtIndexPath(indexPath) { 
      // the cell that is going to be focused 
     } 
     if let indexPath = context.previouslyFocusedIndexPath, let cell = collectionView.cellForItemAtIndexPath(indexPath) { 
      // the cell that is going to be unfocused 
     } 
    }, completion: nil) 
} 
+0

Sorry, ich glaube, Sie meine Frage falsch verstanden. Ich habe etwas mehr Code gepostet. Was ich brauche, ist eine Sammlungsansicht, die den Inhaltsoffset nicht automatisch aktualisiert, wenn der Fokus von einer Zelle zur anderen übergeht. Ich möchte die Inhaltsoffset-Manipulation manuell selbst machen. – RaffAl

-1

Da UICollectionView Subklassen UIScrollView, können Sie Ihre Sammlung Ansicht delegieren Ansicht blättern Delegatmethoden implementieren. Die Sie wollen wahrscheinlich ist:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
       withVelocity:(CGPoint)velocity 
      targetContentOffset:(inout CGPoint *)targetContentOffset 

Die targetContentOffset wird der Scroll-Offset, UIKit zu standardmäßig zu bewegen, aber wenn Sie den Wert ändern, dann wird UIKit dort statt blättern.

Wenn Sie wirklich nicht möchten, dass UIKit automatisch scrollen kann, können Sie das Scrollen immer ganz deaktivieren, indem Sie scrollEnabled auf NO setzen.

1

Gerade in genau dieses Ding gerannt. Um die automatische Scrollen eines UICollectionView zu deaktivieren, wenn der Fokus ändert, nur deaktivieren in den 'Scroll View' Eigenschaften für die Sammlung Ansicht im Interface Builder-Scrolling:

enter image description here

Verwandte Themen