Образец, который я собираюсь сделать, это механизм переключения передач в автомобиле. Он состоит из приблизительно 9 прямых линий под углом 90 градусов, которые мне нужны, чтобы пользователь перетащил UIView.Перетащите UIView по прямому пути и углам
Мой первый подход состоял в том, чтобы проверить координаты центра обзора, и если выполнены определенные условия, включите/отключите x/y соответствующим образом. Это привело к длинному сложному заявлению, которое будет бесполезным для поддержания. Он работает, по большей части - иногда он застревает, но я знаю, что мне нужно сделать, чтобы исправить это.
Моей второй идеей было бы создание очень простой коллекции прямоугольников вокруг моего пути с пространством в середине, достаточно широким, чтобы позволить квадрат, который я бы привязал к виду, которое я хочу переместить. Затем я мог бы использовать обнаружение столкновений, чтобы сохранить вид вдоль пути. Похоже, что это будет работать для самых простых блочных путей, но не будет осуществимо с более сложным путем.
Есть ли другие способы достижения желаемого эффекта?
Кстати, вот мой супер грубый и неэффективный тест для первого сценария:
// The reason we aren't using if else is because we want to allow both x and y movement if they are on a corner.
if(knob.center.x >= 218 && knob.center.x <= 240 && knob.center.y == 140) {
// First line
canMoveX = TRUE;
if(translation.x + knob.center.x < 218) {
translation.x = knob.center.x - 218;
}
else if(translation.x + knob.center.x > 240) {
translation.x = 240 - knob.center.x;
}
}
if(knob.center.x == 240 && knob.center.y >= 140 && knob.center.y <= 230) {
// Second Line
canMoveY = TRUE;
if(translation.y + knob.center.y < 140) { translation.y = knob.center.y - 140; }
else if(translation.y + knob.center.y > 230) { translation.y = 230 - knob.center.y; }
}
if(knob.center.x >= 224 && knob.center.x <= 240 && knob.center.y == 230) {
// Third Line
canMoveX = TRUE;
if(translation.x + knob.center.x < 224) { translation.x = knob.center.x - 224; }
else if(translation.x + knob.center.x > 240) { translation.x = 240 - knob.center.x; }
}
if(knob.center.x == 224 && knob.center.y >= 230 && knob.center.y <= 285) {
// Fourth Line
canMoveY = TRUE;
if(translation.y + knob.center.y < 230) { translation.y = knob.center.y - 230; }
else if(translation.y + knob.center.y > 285) { translation.y = 285 - knob.center.y; }
}
if(knob.center.x >= 205 && knob.center.x <= 224 && knob.center.y == 285) {
// Fifth Line
canMoveX = TRUE;
if(translation.x + knob.center.x < 205) { translation.x = knob.center.x - 205; }
else if(translation.x + knob.center.x > 224) { translation.x = 224 - knob.center.x; }
}
if(knob.center.x == 205 && knob.center.y >= 285 && knob.center.y <= 337) {
// Sixth Line
canMoveY = TRUE;
if(translation.y + knob.center.y < 285) { translation.y = knob.center.y - 285; }
else if(translation.y + knob.center.y > 337) { translation.y = 337 - knob.center.y; }
}
if(knob.center.x >= 133 && knob.center.x <= 205 && knob.center.y == 337) {
// Seventh Line
canMoveX = TRUE;
if(translation.x + knob.center.x < 133) { translation.x = knob.center.x - 133; }
else if(translation.x + knob.center.x > 205) { translation.x = 205 - knob.center.x; }
}
if(canMoveX) {
[piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y)];
[gesture setTranslation:CGPointZero inView:[piece superview]];
}
if(canMoveY) {
[piece setCenter:CGPointMake([piece center].x, [piece center].y + translation.y)];
[gesture setTranslation:CGPointZero inView:[piece superview]];
}
Это работает для анимации представления вдоль пути, однако мне нужно, чтобы пользователь мог перетаскивать путь. –
Пожалуйста, см. Мое редактирование..и думаю, я ответил вам. Надеюсь, это поможет –
Я вижу, где вы собираетесь с этим - это имеет смысл, но я волнуюсь, что он существенно избавит вас от пользователя. Я также должен был указать, что движение должно быть двунаправленным, позволяя пользователю перемещаться вперед или назад вдоль пути в зависимости от того, где они перетаскиваются. Тем не менее, я буду играть с вашей идеей, чтобы проверить, могу ли я работать с надлежащей функциональностью перетаскивания. –