En primer lugar ... es un hecho absoluto que:
hay, sin duda, ningún método, proporcionado por Apple,
para extraer puntos de un UIBezierPath.
Eso es un hecho absoluto a partir de febrero de 2011, en el último sistema operativo, y todo en el horizonte. He hablado con los ingenieros relevantes de Apple sobre el problema. Es molesto en muchos contextos de programación de juegos, pero ese es el hecho. Entonces, ¿podría ser que responda tu pregunta?
En segundo lugar: no olvides que es tan fácil como un pastel animar algo junto con a UIBezierPath. Hay numerosas respuestas en SO, por ejemplo How can I animate the movement of a view or image along a curved path?
En tercer lugar: en cuanto a averiguar dónde ocurrieron los toques, si eso es lo que estás preguntando, como dijo Cory, ¡este es un problema difícil! Pero puede usar CGContextPathContainsPoint para averiguar si un punto (o contacto) estaba en una ruta de un grosor determinado.
Después de eso, suponiendo que estamos hablando de cúbicos, debe encontrar los puntos y las velocidades probables (tandas a.k.a.) a lo largo de un bezier.
Aquí es el código exacto, el total de hacer eso:Find the tangent of a point on a cubic bezier curve (on an iPhone). Lo pegué en la parte inferior, también.
Tendrá que implementar su propio MCsim o iteración para encontrar dónde golpeó, según su situación. Eso no es tan difícil.
(cuarto lugar - como una nota al pie, hay que cosa nueva donde se puede dibujar progresivamente un bezpath, probablemente no es relevante a su pregunta, pero sólo una nota.)
Para la comodidad de cualquiera que lea en el futuro, aquí está el resumen de la cuestión relacionada de las dos rutinas "prácticas" ...
Por último, aquí de la manera más sencilla posible son las dos rutinas para calcular los puntos equidistantes (de hecho, a la misma distancia) y las tangentes de ellos, a lo largo de Bezier:
CGFloat bezierPoint(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d)
{
CGFloat C1 = (d - (3.0 * c) + (3.0 * b) - a);
CGFloat C2 = ((3.0 * c) - (6.0 * b) + (3.0 * a));
CGFloat C3 = ((3.0 * b) - (3.0 * a));
CGFloat C4 = (a);
return (C1*t*t*t + C2*t*t + C3*t + C4 );
}
CGFloat bezierTangent(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d)
{
CGFloat C1 = (d - (3.0 * c) + (3.0 * b) - a);
CGFloat C2 = ((3.0 * c) - (6.0 * b) + (3.0 * a));
CGFloat C3 = ((3.0 * b) - (3.0 * a));
CGFloat C4 = (a);
return ((3.0 * C1 * t* t) + (2.0 * C2 * t) + C3);
}
Los cuatro los valores precalculados, C1 C2 C3 C4, a veces se llaman los coeficientes del bezier. (Recuerde que a b c d se suele llamar los cuatro puntos de control.) Por supuesto, t va de 0 a 1, tal vez por ejemplo cada 0.05. Simplemente llame a estas rutinas una vez para X y por separado una vez para Y. Espero que ayude a alguien!
Un bezierpath es una clase que sólo dibuja cosas. No podrá responder a ningún evento. –
Cierto, pero CGContextPathContainsPoint es una obra de ingeniería increíble, Antwan. ¡Está ahí para ti en cualquier camino bez! – Fattie
¿Alguna suerte? ¿Tienes solución para esto? –