Я вчера работал с приложением "закрутить бутылку". В окне у меня есть ImageView с бутылкой, которая должна реагировать на прикосновения и вращать, как пользователь проводит пальцем. Я изо всех сил пытался заставить мой ImageView вращаться во время сенсорных событий (TouchesBegan, Touchesoved, TouchesEnd). Я использовал этот код в TouchesMoved, чтобы узнать угол поворота для поворота изображения.
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
PointF pt = (touches.AnyObject as UITouch).LocationInView(this);
float x = pt.X - this.Center.X;
float y = pt.Y - this.Center.Y;
double ang = Math.Atan2(x,y);
// yada yada, rotate image using this.Transform
}
ЭТО ВАЖНО! Когда ImageView вращается, даже координаты x & y меняются. Таким образом, постоянное прикосновение к одной и той же области даст мне разные значения в точках pt и prePt. Подумав, погуглив и почитав, я нашел простое решение проблемы. «SuperView» - свойство ImageView.
PointF pt = (touches.AnyObject as UITouch).LocationInView(this.SuperView);
Имея это небольшое изменение на месте, сделав его намного проще, я не могу использовать UITouch-metohs LocationInView и PreviousLocationInView и получить правильные координаты x & y. Она часть моего кода.
float deltaAngle;
public override void TouchesMoved (NSSet touches, UIEvent evt)
{
PointF pt = (touches.AnyObject as UITouch).LocationInView(this.Superview);
float x = pt.X - this.Center.X;
float y = pt.Y - this.Center.Y;
float ang = float.Parse(Math.Atan2(dx,dy).ToString());
//do the rotation
if (deltaAngle == 0.0) {
deltaAngle = ang;
}
else
{
float angleDif = deltaAngle - ang;
this.Transform = CGAffineTransform.MakeRotation(angleDif);
}
}
Надеюсь, это помогло кому-то потратить часы на то, чтобы понять, как безумно вращать бутылку! :)