2013-01-24 2 views
0

Je travaille sur un projet qui utilise un UICollectionView (PSUICollectionView) et j'ai ajouté un UISearchBar en haut de cette vue de collection. Ce que je veux maintenant faire est de faire défiler cette barre de recherche par défaut jusqu'à ce que l'utilisateur l'arrête. Ce comportement est très facile à faire dans un UITableView, cependant contentSize de UICollectionView n'est même pas initialisé jusqu'à ce que viewDidAppear !! Par conséquent, définir la hauteur de la barre de recherche de contentOffset n'a aucun effet, à moins que cela ne soit fait dans viewDidAppear (ce qui n'est pas ce que je veux). Est-ce que quelqu'un a compris en utilisant un UISearchBar avec UICollectionView et comment le faire défiler par défaut?Défilement de UISearchBar dans un UICollectionView par défaut

Merci! -Amit

+0

je répondu à un problème similaire ici http://stackoverflow.com/questions/15787754/set-minimum-contentsize-for-uicollectionview – michael23

Répondre

0

Je n'ai pas eu de réponse à ma question mais je vais poster ce que j'ai finalement fini par faire. J'ai utilisé un scrollview et ajouté la barre de recherche et la vue de collection comme sous-vues à la scrollview. C'est le point crucial de la solution, mais le faire fonctionner correctement est assez délicat. Ce que vous devez faire lorsque vous ajoutez une vue de collection en tant que sous-vue, c'est de faire en sorte que sa hauteur d'image soit la même que celle de contentSize. Cela permet de s'assurer que la vue de collection ne défile pas en elle-même et que la prévisualisation gère plutôt le défilement. Une autre chose à garder à l'esprit est que, contrairement à UITableView, les objets UICollectionView n'obtiennent pas leur contentSize mis à jour jusqu'à viewDidAppear. J'ai donc dû définir un faux cadre et contentSize dans viewWillAppear puis réajuster dans viewDidAppear.

0

Il me semble que quelque chose ne va pas avec la façon dont la vue de collection a été ajoutée à son collectionview-controller ou la façon dont ce viewviewcontroller est présenté par un autre contrôleur de vue. Utilisez-vous un confinement de contrôleur de vue personnalisé? Si c'est le cas, veillez à notifier childViewControllers (comme votre collectionView) qu'il a été ajouté à un parent.

Si aucun de ces éléments n'est affiché, il se peut que vous n'ayez pas chargé vos objets de données avant d'atteindre viewDidAppear. Si vous les chargez manuellement dans un tableau, quand appelez-vous reloadData? Si vous utilisez NSFetchedResultsController, vérifiez que vous disposez de fetchedObjects avant l'affichage de la vue, car ils sont nécessaires au calcul de la propriété contentSize.

Avez-vous sous-classé UICollectionViewFlowLayout? Si oui, appelle-t-il prepareLayout avant que la vue n'apparaisse?

Pas beaucoup de réponse, mais il semble que votre problème pourrait être à plusieurs endroits.

0

J'ai fait une chose semblable en ajoutant un retard, puis d'appeler cette méthode:

[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES]; 
0

Cette solution a fonctionné pour moi

1.Assurez-vous de cliquer d'abord

2.Custom Class

3.Give un identifiant

enter image description here

4.

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
      viewForSupplementaryElementOfKind:(NSString *)kind 
           atIndexPath:(NSIndexPath *)indexPath 
{ 
    return [self.imageCollection dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"collectionViewHeader" forIndexPath:indexPath]; 
} 

5.Sur ajouter storyboard barre de recherche à en-tête partie.

Devrait fonctionner!

0

je finis à l'aide de cette astuce:

Adjust l'encart dans le viewDidLoad et remettre à zéro à nouveau dans le viewdidappear et régler la contentoffet leur aussi.

viewDidLoad:

[self.mainCollectionView setContentInset:UIEdgeInsetsMake(-44, 0, 0, 0)]; 
firstTime = TRUE; 

viewDidAppear:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 


    if (firstTime) { 
     [self.mainCollectionView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 
     [self.mainCollectionView setContentOffset:CGPointMake(0, 44)]; 
     firstTime = FALSE; 
    } 
} 
Questions connexes