9
votes

Lire la position de Uipickerview tout en faisant défiler?

J'ai un uipickerview avec des cellules personnalisées. Pour chaque instant, j'aimerais savoir quelle cellule se trouve dans l'emplacement central (derrière l'indicateur de sélection teinté). La méthode de la déléguée UIPICKERVIEW

2011-03-09 08:00:34.429 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.430 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.430 Project[35069:207] Change: {
    kind = 1;
    new = "NSRect: {{2, -13}, {118, 70}}";
    old = "NSRect: {{2, -13}, {118, 70}}";
}
2011-03-09 08:00:34.431 Project[35069:207] Frame: x=2.00, y=-13.00
2011-03-09 08:00:34.431 Project[35069:207] Location: x=4.00, y=-26.00
2011-03-09 08:00:34.432 Project[35069:207] Change: {
    kind = 1;
    new = "NSRect: {{2, -13}, {118, 70}}";
    old = "NSRect: {{2, -13}, {118, 70}}";

(Location coordinates are in window frame) 


0 commentaires

6 Réponses :


2
votes

Vous pouvez utiliser -PickerView de votre délégué de votre sélecteur: Titlefornor: ForComponent: Méthode pour vous donner une bonne idée de l'endroit où se trouve la roue du cueilleur. Lorsque vous faites défiler dans une direction ou l'autre, le sélecteur posera son délégué pour le titre (ou la vue) pour une ligne. Le nombre de lignes entre le "centre" de la roue et la rangée que le sélecteur demande dépend de la hauteur de la ligne, mais vous saurez probablement ce que c'est.

Vous devrez expérimenter un peu pour bien réussir. Le sélecteur semble demander une ou deux rangées qui ne sont pas encore visibles, peut-être de garder le défilement lisse. Dans mon test avec un sélecteur qui affiche 5 lignes, il semble y avoir une différence de 3 rangs entre la rangée que le cueilleur demandait et le centre. Vous devez évidemment garder une trace de la direction de la rotation (haut ou bas) et vous ne saurez pas si les deux ou les deux dernières lignes sont sélectionnées jusqu'à votre -Pickview: DisSelectrow: Incomponent: est appelé.


3 commentaires

J'ai vu cette idée ailleurs, mais cela semble un peu dangereux. Vous ne savez jamais combien de vues seront exactement préchargées. Le nombre peut varier dans différentes versions iOS, peut-être également en fonction de la disponibilité de la mémoire de l'appareil. J'ai levé les yeux dans la documentation, mais je n'ai trouvé rien de spécifié à cet égard.


Il n'y a définitivement aucune garantie et comme je l'ai mentionnée au-dessus de la technique n'est pas sans défauts. Je recommanderais absolument des tests en profondeur. À court de rouler votre propre vue de choix, je pense que c'est le plus proche que vous obtiendrez une notification en temps réel des modifications apportées au sélecteur.


Je fais cela, où je vérifie que chaque changement est consécutif, en tant que pickerview: Titrefornor: ForComponent: Pré-extrait des lignes de manière aléatoire, donc je garde la vieille rangée quelque part et n'agirez que si elle est une place ou une autre. (rangée == auto.oldow + 1 || rangée == auto.oldow - 1) ~



1
votes

Je pense que c'est intéressant. Je voulais faire la même chose avec Uipicker, mais je n'ai pas encore regardé encore.

UidatePicker fait en fait ceci, vous pouvez faire glisser le temps à midi et il basculera AM / PM même si le doigt n'a pas été soulevé de l'écran (il ne devrait pas avoir appelé "DisSelectrow").

UidatePicker en fait des sous-classes d'Uicontrol, au lieu d'UIView comme Uipickerview. Ainsi, UidatePicker observe probablement tous les uicontrolvents de faire cela.

Observer -Pickerview: Titlefornor: Forceponent fonctionne probablement pour l'instant, mais si le comportement change plus tard (c'est-à-dire le comportement de la mise en cache, c'est-à-dire) est modifié, cela va rompre ...

Une suggestion est d'essayer KVO sur la propriété centrale, au lieu du cadre.

Edit1: Au fait, comment la méthode de votre observationvaluepersyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyPatheyypathe

Edit2: À la recherche ultérieure, il semble que la plupart des uikit ne sont pas conformes au KVO.
Voir cette réponse - Valeur de la clé Observation des animations UIView

Donc, il semble que la seule option consiste à conserver la base de la valeur de la vue quand elle est visible. Qu'en est-il de la propriété de Forloop and Polle Cadre / Centre à chaque fois que c'est en vue?


0 commentaires

0
votes

Le cadre ne change pas car la cellule ne bouge pas. L'un de ses superviews est et la cellule est portée avec elle. Pour déterminer la coordonnée de la cellule dans le parent uipickerview , essayez ceci: xxx

Le rectangle résultant sera dans le système de coordonnées de ThePicker et vous pouvez ensuite comprendre si c'est au milieu avec le test simple suivant: xxx


2 commentaires

Je le fais déjà avec l'origine du cadre. Ne pense pas que cela fait de différence si je transforme les limites ou l'origine du cadre?


Nope, bien que l'origine de la cellule puisse ou non aligner avec les limites visibles de la vue du conteneur. Essayez avec le rect complet et voir?



0
votes

Juste une pensée rapide, mais vous pouvez ajouter un UISCrollView (transparent avec un contenuView qui est aussi grand que le nombre de composants.) Sur l'UIPICKERView.

Puis écoutez les méthodes UiscrollviewDelegate pour obtenir les données de défilement en direct dont vous avez besoin.

La partie délicate serait passant le long des événements tactiles du défileur au sélecteur afin qu'il agisse comme prévu.


0 commentaires

0
votes

Le problème que vous avez avec Uipickerview est que la vue que vous définissez pour que les cellules sont en réalité. Uipickerview est construit à partir de diverses vues ImageViews, une vision de la TableView et une ligne de sélection. La vue que vous fournissez lorsque vous utilisez le viseur est insérée sous forme de sous-visions des cellules de la TableView et que leur cadre n'est donc jamais modifié. Le seul cadre qui change est le cadre de la cellule de la tableView réelle, auquel, bien sûr, vous n'avez pas accès.

Une solution possible consiste simplement à remplacer la View de l'UIPICKERVIEW par votre propre.

Vous pouvez le faire en réglant le nombre de lignes pour que UIIIPICKERView soit 0 et placez une table transparente sur l'UIPICKERView. Votre TableView détiendra les cellules réelles et, étant donné une View hérités d'UiscrollView, vous pouvez obtenir des événements sur le défilement et simplement vérifier quel UitaireViewCell est actuellement sous la ligne de sélection.


0 commentaires

4
votes

Je pense que la méthode: xxx

avec: xxx

est exactement ce que vous voulez.


0 commentaires