2009-08-06 8 views
7

Vous savez probablement que l'OS de l'iPhone fait un retard artificiel d'environ 0.25 secondes après une toucheBegan: survient. C'est pour vérifier si l'utilisateur a l'intention de se déplacer ou non. Si les deltas bougent suffisamment pendant ce temps, une séquence touchesMoved: démarre. Toutefois, lorsque vous souhaitez appliquer un comportement au toucher tactile dans votre application, vous ne voulez peut-être pas attendre plus longtemps. Il a l'air si moche! Vous commencez à bouger quelque chose, et pendant 0,3 secondes rien ne se passe. Ensuite, BANG et le tout commence à bouger d'un grand coup. Cela arrive chaque fois qu'une nouvelle séquence tactile avec mouvement commence. Cela craint sérieusement. Bien sûr, dans certaines situations, il est nécessaire parce que vous pouvez vouloir déterminer si l'utilisateur a vraiment l'intention de se déplacer. mais pas sur un curseur de construction personnalisée ou tout autre type de contrôle tactile qui fonctionne en suivant les mouvements tactiles.Est-il possible de tirer pour les points de contact immédiatement après les touchesBegan: est appelé?

Donc, après avoir compris que cela se produit intentionnellement par iPhone OS, je voudrais savoir comment surmonter ce problème. Je ne peux pas prédire le mouvement car l'utilisateur pourrait se déplacer vers la gauche ou vers la droite. Je ne sais pas cela dans touchesBegan :. 0,3 seconde est juste suffisant pour rendre l'application ne répond pas.

Cependant, il semble y avoir de l'espoir: Convertbot n'a absolument aucun problème avec cela. La roue tourne immédiatement en le touchant et en le déplaçant. Il n'y a pas de décalage, pas de retard. J'ai demandé dans leur blog comment ils l'ont fait, mais aucune réponse pour le moment.

J'espère qu'il y a un moyen de retirer manuellement les coordonnées tactiles du système. Lorsque touchesBegan:, je commencerais un intervalle qui tire à 60hz jusqu'à touchesMoved: prend des mesures.

Alors la plus grande question sur cette planète: "Comment est-ce possible"?

+0

Je voudrais faire un Bounty avec ça. Mais il semble que je ne peux pas? –

+0

"BANG! Le tout commence à bouger avec un gros flip!" Je suis à la recherche d'une solution pour cela aussi. – bobobobo

+0

Nous avons tous été mordu par cela à un moment je pense. J'ai posé une question à ce sujet il y a un moment, mais je n'ai pas réalisé que c'était les touchesMoves qui étaient retardées qui provoquaient la saccade dans mon animation (je pensais que c'était le code de rendu réel). Ce qui me dérange vraiment, c'est que UIScrollView récupère immédiatement les mouvements - ils sont super doux. – U62

Répondre

4

Si vos répondeurs sont dans un UIScrollView, assurez-vous que le paramètre delaysContentTouches de scrollView est défini sur NO. Cela fonctionnera pour la méthode touchesBegan: UIResponder et la méthode beginTrackingWithTouch: d'UIControl.

0

Si votre sous-classe UIView est une sous-vue d'un UITableView ou de l'un de ses descendants, tel que UITableView, vous devez delaysContentTouches à NO dans la vue déroulante ou dans la vue tabulaire. De cette façon, il va immédiatement envoyer la première touche à votre touchesBegain:.

Cependant, je pense que ConvertBot n'utilise pas du tout UIScrollView: c'est probablement un UIView personnalisé qui implémente la partie rotative elle-même. Si votre interface utilisateur ne nécessite pas de défilement, placez simplement votre sous-classe UIView dans la vue du contenu et vous n'avez pas besoin de définir delaysContentTouches car il n'y a pas de vue déroulante pour intercepter les événements tactiles.

Questions connexes